python - локаль в dateutil / parser

Я установил

locale.setlocale(locale.LC_TIME, ('de', 'UTF-8'))

строка для синтаксического анализа:

Montag, 11. April 2016 19:35:57

Я использую:

note_date = parser.parse(result.group(2))

но получите следующую ошибку:

Traceback (последний вызов последним): файл "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", строка 1531, в globals = debugger.run (setup ['file'], None, None, is_module ) Файл "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", строка 938, при запуске pydev_imports.execfile (file, globals, locals) # выполнить файл сценария "/Applications/PyCharm.app/Contents /helpers/pydev/_pydev_imps/_pydev_execfile.py ", строка 18, в execfile exec (compile (content +" \ n ", file, 'exec'), glob, loc) File" / Users / adieball / Dropbox / Multiverse / Programming /python/repositories/kindle/kindle2en.py ", строка 250, в основном (sys.argv [1:]) файле" /Users/adieball/Dropbox/Multiverse/Programming/python/repositories/kindle/kindle2en.py ", строка 154, в основном файле note_date = parser.parse (result.group (2)) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/dateutil/parser.py", строка 1164, при синтаксическом анализе возвращает DEFAULTPARSER.parse (timestr, ** k wargs) Файл "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/dateutil/parser.py", строка 555, при синтаксическом анализе вызывает ValueError ("Неизвестный строковый формат") ValueError: Неизвестный строковый формат

отладка показывает, что парсер не использует "правильные" значения dateutil (немецкий), он все еще использует английские.

введите описание изображения здесь

Я уверен, что упускаю здесь что-то очевидное, но не могу этого найти.

Спасибо.


person f0rd42    schedule 27.05.2016    source источник


Ответы (2)


dateutil.parser не использует locale. Вам нужно будет создать подкласс dateutil.parser.parserinfo и создать немецкий эквивалент :.

from dateutil import parser

class GermanParserInfo(parser.parserinfo):
    WEEKDAYS = [("Mo.", "Montag"),
                ("Di.", "Dienstag"),
                ("Mi.", "Mittwoch"),
                ("Do.", "Donnerstag"),
                ("Fr.", "Freitag"),
                ("Sa.", "Samstag"),
                ("So.", "Sonntag")]

s = 'Montag, 11. April 2016 19:35:57'
note_date = parser.parse(s, parserinfo=GermanParserInfo())

Вам нужно будет расширить это, чтобы также работать для других значений, таких как названия месяцев.

person Simeon Visser    schedule 27.05.2016
comment
Если я правильно помню, существуют следующие библиотеки, которые обрабатывают другие локали, например dateparser. Наверное, лучше использовать один из них, чем поддерживать свою собственную библиотеку крайних случаев локали. - person Paul; 27.05.2016

В другом ответе я ответил на простой класс parseinfo с учетом локали. Это не полное решение для всех языков мира, но решило все мои проблемы с локализацией.

Вот:

import calendar
from dateutil import parser
    
class LocaleParserInfo(parser.parserinfo):
    WEEKDAYS = zip(calendar.day_abbr, calendar.day_name)
    MONTHS = list(zip(calendar.month_abbr, calendar.month_name))[1:]

И вы можете использовать:

In [1]: import locale;locale.setlocale(locale.LC_ALL, "pt_BR.utf8")
In [2]: from localeparserinfo import LocaleParserInfo                                   

In [3]: from dateutil.parser import parse                                                

In [4]: parse("Ter, 01 Out 2013 14:26:00 -0300", parserinfo=PtParserInfo())              
Out[4]: datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800))

Протестируйте его и взгляните на переменные класса в исходной информации parseinfo, особенно на переменную HMS. Возможно, нужно будет объявить другие переменные.

person neves    schedule 26.06.2020