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 редове от Windows-формат \r\n CRNL комбо).

Не съм сигурен защо полагате толкова големи усилия, за да конвертирате днешната дата в низ, да я анализирате в 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