¿Cómo usar la función ‘parse’ de python_dateutil 1.5 para trabajar con Unicode?

Necesito que Python_dateutil 1.5 parse () funcione con los nombres de mes de Unicode.

Si usa fuzzy = True, omite el nombre del mes y produce el resultado con month = 1

Cuando lo uso sin parámetros difusos obtengo la siguiente excepción:

from dateutil.parser import parserinfo, parser, parse class myparserinfo(parserinfo): MONTHS = parserinfo.MONTHS[:] MONTHS[3] = (u"Foo", u"Foo", u"Июнь") >>> test = unicode('8th of Июнь', 'utf-8') >>> tester = parse(test, parserinfo=myparserinfo()) Traceback (most recent call last): File "", line 1, in  File "C:\Python27\lib\site-packages\python_dateutil-1.5-py2.7.egg\dateutil\parser.py", line 695, in parse return parser(parserinfo).parse(timestr, **kwargs) File "C:\Python27\lib\site-packages\python_dateutil-1.5-py2.7.egg\dateutil\parser.py", line 303, in parse raise ValueError, "unknown string format" ValueError: unknown string format 

    Rik Poggi tiene razón, la cadena ‘Июнь’ no puede ser un mes para python-dateutil . Cavando un poco en dateutil/parser.py , el problema básico es que este módulo solo es lo suficientemente internacionalizado para manejar idiomas de escritura latina de Europa occidental. No está diseñado para poder manejar idiomas, como el ruso, utilizando scripts no latinos, como el cirílico.

    El mayor obstáculo está en dateutil/parser.py:45-48 , donde la class _timelex analizador léxico class _timelex define los caracteres que se pueden usar en tokens, incluidos los nombres de mes y día:

     class _timelex(object): def __init__(self, instream): # ... [some material omitted] ... self.wordchars = ('abcdfeghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_' 'ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ' 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ') self.numchars = '0123456789' self.whitespace = ' \t\r\n' 

    Debido a que las wordchars no incluyen letras cirílicas, _timelex emite cada byte en la cadena de fecha como un carácter separado. Esto es lo que observó Rik.

    Otro gran obstáculo es que dateutil usa cadenas de bytes de Python en lugar de cadenas de Unicode internamente para todo su procesamiento. Esto significa que, incluso si _timelex se extendiera para aceptar letras cirílicas, aún habría desajustes entre el manejo de bytes y de caracteres, y los problemas causados ​​por la diferencia en la encoding de la cadena entre el python_dateutil y el código fuente de python_dateutil .

    Hay otros problemas menores, como la suposición de que el nombre de cada mes tiene al menos 3 caracteres (no es cierto para el japonés) y muchos detalles relacionados con el calendario gregoriano. Sería útil que el campo de parserinfo de parserinfo si está presente, de modo que parserinfo pueda definir el conjunto correcto de caracteres para sus nombres de mes y día.

    python_dateutil v 2.0 se ha portado a Python 3, pero los problemas de diseño anteriores no se han modificado significativamente. Las diferencias entre 2.0 y 1.5 son para manejar los cambios de lenguaje de Pyhon, no el diseño y las estructuras de datos de dateutil.

    Oleg, pudiste modificar parserinfo y sospecho que lo lograste porque tu código de prueba no usó el parser() (y _timelex ) de python_dateutil . En esencia, usted suministró su propio analizador y lexer.

    Corregir este problema requeriría mejoras bastante importantes en el manejo del texto de python_dateutil . Sería fantástico si alguien hiciera un parche con ese cambio, y los mantenedores del paquete pudieran incorporarlo.

    dateutil/parser.py un vistazo al código fuente en dateutil/parser.py , y básicamente descubrí que la cadena 'Июнь' no puede ser un mes para dateutil .

    El problema comienza cuando tu timestr se timestr .

    En la línea 349 tienes:

     l = _timelex.split(timestr) 

    y dado que _timelex.split se define como:

     def split(cls, s): # at line 142 return list(cls(s)) 

    tienes que ser

     ['8', 'th', ' ', 'of', ' ', '\x18', '\x04', 'N', '\x04', '=', '\x04', 'L', '\x04'] 

    en lugar de (más o menos) lo que uno esperaría que fuera:

     [u'8th', u'of', u'\u0418\u044e\u043d\u044c'] 

    Por este motivo, el mes de verificación de devolución None , lo que lleva a elevar una excepción.

     # Check month name value = info.month(l[i]) 

    Posible solución:

    Traducir todo en inglés y luego, si es necesario, volver en ruso.

    Ejemplo:

     dictionary = {u"Июнь": 'June', u'ноябрь': 'November'} for russian,english in dictionary.items(): test = test.replace(russian,english)