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

6

我相信这个问题有一个非常简单的解决方案,但我对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__ 方法,这是 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)


1
感谢您的回答。我在Windows电脑上使用easy_install来安装dateutil(它已经在Linux电脑上安装好了)。看起来它安装了错误的版本(Python 2.7上的Dateutil 2.0)。 - Steve Criddle
谢谢。我遇到了同样的问题,因为我很糟糕,不总是在我的虚拟环境中使用--no-site-packages。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接