dateutil.parser.parse() 在Windows平台上报错“initial_value必须是unicode或None,而不是str”
我相信这个问题有个很简单的解决办法,但我对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)