Datetime работает в Windows, но не в Debian

При попытке запустить этот код я получаю сообщение об ошибке в Debian, но он работает в Windows.

def checkTime():
    while True:
        with open('date.txt') as tar:
            target = tar.read()
            current = str(datetime.strptime(str(date.today()),'%Y-%m-%d'))[:-9]
            if datetime.strptime(current, '%Y-%m-%d') >= datetime.strptime(target, '%Y-%m-%d'):
                doSomething()
        sleep(10)

Это дает мне эту ошибку:

File "/usr/lib/python2.6/_strptime.py", line 328, in _strptime
    data_string[found.end():])
ValueError: unconverted data remains:

date.txt содержит:

2013-03-21

Обе системы имеют одинаковые настройки даты и времени.


person Leinad177    schedule 21.03.2013    source источник
comment
Почему вы конвертируете сегодняшнюю дату в строку, затем снова конвертируете ее в дату и время, затем снова конвертируете в строку только для того, чтобы снова преобразовать ее в объект даты и времени?!   -  person Martijn Pieters    schedule 21.03.2013
comment
Для науки! Или более реалистичное объяснение состоит в том, что я склонен все усложнять.   -  person Leinad177    schedule 21.03.2013


Ответы (2)


Ваша обработка даты слишком сложна.

Это должно работать на любой платформе:

with open('date.txt') as tar:
    target = tar.read().strip()
    if date.today() >= datetime.strptime(target, '%Y-%m-%d').date():

с вызовом .strip(), удаляющим любые посторонние пробелы (например, \r строк из комбинации \r\n CRNL в формате Windows).

Я не уверен, почему вы так долго преобразовываете сегодняшнюю дату в строку, анализируете ее в объект datetime, а затем снова конвертируете в строку. В любом случае формат строки по умолчанию для объектов datetime.date соответствует стандарту ISO8601, что соответствует формату %Y-%m-%d:

>>> import datetime
>>> str(datetime.date.today())
'2013-03-21'

Чтобы преобразовать объект datetime.date в объект datetime.datetime, используйте метод .combine() и добавьте в смесь объект datetime.time:

>>> datetime.datetime.combine(datetime.date.today(), datetime.time.min)
datetime.datetime(2013, 3, 21, 0, 0)

Вызвав .date() для экземпляра datetime.datetime, вы снова можете получить объект datetime.date:

>>> datetime.datetime.now().date()
datetime.date(2013, 3, 21)
person Martijn Pieters    schedule 21.03.2013
comment
Спасибо. Это объясняло это довольно хорошо. - person Leinad177; 21.03.2013

Вероятно, это связано с тем, что файл «date.txt» содержит окончания строк в стиле Windows («\r\n»), а Unix (Debian) обрабатывает только «\n».

Попробуйте открыть файл с универсальными концами строк:

open('date.txt','U')
person isedev    schedule 21.03.2013