2011-10-18 15 views
6

Tôi chắc chắn có một giải pháp thực sự đơn giản cho điều này, nhưng tôi vẫn còn khá mới với Python.dateutil.parser.parse() cho lỗi "initial_value phải là unicode hoặc None, không str" trên nền tảng Windows

Tôi đang cố gắng sử dụng dateutil.parser.parse() để phân tích một chuỗi với một dấu thời gian trong đó:

>>> 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 

này hoạt động tốt trên máy chủ Linux của tôi, nhưng trên hộp thử nghiệm Windows của tôi nó mang lại một lỗi:

>>> 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 

Nếu tôi cố gắng đưa ra dateutil.parser.parse() một chuỗi unicode, điều đó không làm việc trên Windows hộp hoặc:

>>> 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' 

Tuy nhiên, điều này cũng hoạt động trên hộp Linux.

Trả lời

15

Đây không phải là vấn đề với Windows, đó là vấn đề phiên bản thư viện/phiên bản Python.

dateutil 2.0 được viết để chỉ hỗ trợ Python 3, không phải Python 2.X. Cả hai trường hợp ở đây đều chứa các lỗi khi được sử dụng với Python 2.X.

Trong trường hợp thứ nhất:

dateutil.parser.parse("2011-10-01 12:00:00+01:00") 

lớp io.StringIO chỉ cho phép lập luận unicode, nhưng mã lần đọc:

if isinstance(instream, str): 
     instream = StringIO(instream) 

Trong trường hợp thứ hai:

dateutil.parser.parse(unicode("2011-10-01 12:00:00+01:00")) 

nếu bạn nhìn vào lớp _timelex, nó chứa __next__ , đó là cách Python3 chỉ ra rằng một đối tượng hỗ trợ giao thức lặp. Trong Python 2.X, tên của phương thức phải là next.

Kiểm tra xem bạn có cùng phiên bản của cả Python và thư viện trên Linux và Windows không. Từ project website:

python-dateutil-2.0.tar.gz (Python >= 3.0)

python-dateutil-1.5.tar.gz (Python < 3.0)

+1

Cảm ơn câu trả lời của bạn. Tôi đã sử dụng easy_install để cài đặt dateutil cho tôi trên hộp Windows (nó đã được cài đặt trên hộp Linux). Dường như nó đã cài đặt sai (Dateutil 2.0 trên Python 2.7). –

+0

Cảm ơn. Ran vào cùng một vấn đề bởi vì tôi rất xấu và không phải lúc nào cũng sử dụng --no-site-packages trong virtualenv của tôi. – Tom

Các vấn đề liên quan