Dateutil.parser.parse() дает ошибку "initial_value должен быть unicode или None, а не str" на платформе Windows
Я уверен, что есть действительно простое решение, но я все еще довольно новичок в Python.
Я пытаюсь использовать dateutil.parser.parse() для синтаксического анализа строки с меткой времени:
>>> import dateutil.parser
>>> a = dateutil.parser.parse("2011-10-01 12:00:00+01:00")
>>> print a
2011-10-01 12:00:00+01:00
Это отлично работает на моем Linux-сервере, но на моем тестовом поле Windows появляется сообщение об ошибке:
>>> import dateutil.parser
>>> a = dateutil.parser.parse("2011-10-01 12:00:00+01:00")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 698, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 302, in parse
res = self._parse(timestr, **kwargs)
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 350, in _parse
l = _timelex.split(timestr)
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 144, in split
return list(cls(s))
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 44, in __init__
instream = StringIO(instream)
TypeError: initial_value must be unicode or None, not str
Если я попытаюсь предоставить dateutil.parser.parse() строку unicode, которая не работает в окне Windows:
>>> a = dateutil.parser.parse(unicode("2011-10-01 12:00:00+01:00"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 698, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 302, in parse
res = self._parse(timestr, **kwargs)
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 350, in _parse
l = _timelex.split(timestr)
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 144, in split
return list(cls(s))
TypeError: iter() returned non-iterator of type '_timelex'
Тем не менее это также работает в ящике Linux.
Ответы
Ответ 1
Это не проблема Windows, проблема с версией/версией Python.
dateutil 2.0 написан для поддержки только Python 3, а не Python 2.X. Оба случая здесь содержат ошибки при использовании с Python 2.X.
В первом случае:
dateutil.parser.parse("2011-10-01 12:00:00+01:00")
класс io.StringIO
допускает только аргументы в unicode, но код читает:
if isinstance(instream, str):
instream = StringIO(instream)
Во втором случае:
dateutil.parser.parse(unicode("2011-10-01 12:00:00+01:00"))
если вы посмотрите на класс _timelex
, он содержит метод __next__
, который является способом Python3, указывающим, что объект поддерживает протокол итерации. В Python 2.X имя метода должно быть next
.
Проверьте, есть ли у вас одинаковые версии как Python, так и библиотеки в Linux и Windows. Из веб-сайт проекта:
python-dateutil-2.0.tar.gz(Python >= 3.0)
python-dateutil-1.5.tar.gz(Python < 3.0)