dateutil.parser.parse() gives error "initial_value must be unicode or None, not str" on Windows platform

python, python-dateutil

Solution

It's not a Windows issue, it's Python version / library version issue.

dateutil 2.0 is written to support only Python 3, not Python 2.X. Both cases here contain bugs when used with Python 2.X.

In the first case:

dateutil.parser.parse("2011-10-01 12:00:00+01:00")

the `io.StringIO` class allows only unicode arguments, but the code reads:

    if isinstance(instream, str):
        instream = StringIO(instream)

In the second case:

dateutil.parser.parse(unicode("2011-10-01 12:00:00+01:00"))

if you look at `_timelex` class, it contains the `__next__` method, which is Python3's way of indicating that an object supports iteration protocol. In Python 2.X, the name of the method should be `next`.

Check if you have the same versions of both Python and the library on Linux and Windows. From project website:

python-dateutil-2.0.tar.gz (Python >= 3.0)

python-dateutil-1.5.tar.gz (Python < 3.0)

Problem

I'm sure there's a really simple solution to this, but I'm still fairly new to Python. I'm trying to use dateutil.parser.parse() to parse a string with a timestamp in it: ``` >>> 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 ``` This works fine on my Linux server, but on my Windows test box it gives an error: ``` >>> 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 ``` If I try giving dateutil.parser.parse() a unicode string, that doesn't work on the Windows box either: ``` >>> 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' ``` Yet this also works on the Linux box.

Original source