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

6 投票
1 回答
10016 浏览
提问于 2025-04-17 04:32

我相信这个问题有个很简单的解决办法,但我对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 个回答

17

这不是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__方法,这个是Python 3用来表示一个对象支持迭代的方式。在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)

撰写回答