【问题标题】:dateutil.parser.parse() gives error "initial_value must be unicode or None, not str" on Windows platformdateutil.parser.parse() 在 Windows 平台上给出错误“initial_value must be unicode or None, not str”
【发布时间】:2023-03-31 13:20:02
【问题描述】:

我确信有一个非常简单的解决方案,但我对 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 机器。

【问题讨论】:

    标签: python python-dateutil


    【解决方案1】:

    这不是 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 >= 3.0)

    python-dateutil-1.5.tar.gz (Python

    【讨论】:

    • 感谢您的回答。我使用 easy_install 在 Windows 机器上为我安装 dateutil(它已经安装在 Linux 机器上)。似乎它安装了错误的(Python 2.7 上的 Dateutil 2.0)。
    • 谢谢。遇到同样的问题,因为我很糟糕,并不总是在我的 virtualenvs 中使用 --no-site-packages。
    猜你喜欢
    • 2015-04-17
    • 1970-01-01
    • 2023-02-07
    • 2018-12-23
    • 1970-01-01
    • 2022-11-16
    • 2019-09-28
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多