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 机器。

4

1 回答 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)

于 2011-10-18T09:19:18.530 回答