2011-10-18 10 views
6

Sono sicuro che c'è una soluzione molto semplice a questo, ma sono ancora abbastanza nuovo per Python.dateutil.parser.parse() restituisce l'errore "initial_value deve essere unicode o None, not str" sulla piattaforma Windows

Sto cercando di utilizzare dateutil.parser.parse() per analizzare una stringa con un timestamp in esso:

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

Questo funziona bene sul mio server Linux, ma sulla mia macchina di prova di Windows dà un errore:

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

se provo dando dateutil.parser.parse() una stringa unicode, che non funziona sulla scatola di Windows sia:

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

Tuttavia, questo funziona anche su Linux.

risposta

15

Non è un problema di Windows, è un problema di versione di Python/libreria.

dateutil 2.0 è stato scritto per supportare solo Python 3, non Python 2.X. Entrambi i casi qui contengono bug quando vengono usati con Python 2.X.

Nel primo caso:

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

classe io.StringIO consente solo argomenti Unicode, ma il codice legge:

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

Nel secondo caso:

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

se guarda la classe _timelex, contiene lo __next__ metodo, che è il modo in cui Python3 indica che un oggetto supporta il protocollo di iterazione. In Python 2.X, il nome del metodo deve essere next.

Verificare se si dispone delle stesse versioni di Python e della libreria su Linux e Windows. Da project website:

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

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

+1

Grazie per la risposta. Ho usato easy_install per installare dateutil per me sulla scatola di Windows (era già installato sulla scatola Linux). Sembra che abbia installato quello sbagliato (Dateutil 2.0 su Python 2.7). –

+0

Grazie. Sono entrato nello stesso problema perché sono molto cattivo e non uso sempre --no-site-packages nei miei virtualenvs. – Tom