dateutil.parser.parse()在Windows平台上给出错误"initial_value必须是unicode或None,而不是str"

Ste*_*dle 6 python python-dateutil

我确信这有一个非常简单的解决方案,但我仍然是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
Run Code Online (Sandbox Code Playgroud)

这在我的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
Run Code Online (Sandbox Code Playgroud)

如果我尝试给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'
Run Code Online (Sandbox Code Playgroud)

然而,这也可以在Linux机器上运行.

Dzi*_*inX 16

这不是Windows问题,而是Python版本/库版本问题.

编写dateutil 2.0只支持Python 3,而不支持Python 2.X. 这两种情况都与Python 2.X一起使用时包含错误.

在第一种情况下:

dateutil.parser.parse("2011-10-01 12:00:00+01:00")
Run Code Online (Sandbox Code Playgroud)

io.StringIO班只允许Unicode参数,但代码如下:

    if isinstance(instream, str):
        instream = StringIO(instream)
Run Code Online (Sandbox Code Playgroud)

在第二种情况:

dateutil.parser.parse(unicode("2011-10-01 12:00:00+01:00"))
Run Code Online (Sandbox Code Playgroud)

如果查看_timelex类,它包含__next__方法,这是Python3指示对象支持迭代协议的方式.在Python 2.X中,方法的名称应该是next.

检查在Linux和Windows上是否具有相同版本的Python和库.来自项目网站:

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

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