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

时间:2011-10-18 08:38:35

标签: 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

这在我的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 个答案:

答案 0 :(得分:15)

这不是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

检查Linux和Windows上是否有相同版本的Python和库。来自project website

  

python-dateutil-2.0.tar.gz(Python&gt; = 3.0)

     

python-dateutil-1.5.tar.gz(Python&lt; 3.0)