Простой Python. Современный стиль программирования (Любанович) - страница 176

>··python3.3/_strptime.py", line 337, in _strptime

>····(data_string, format))

>ValueError: time data '2012-13-29' does not match format '%Y-%m-%d'

Имена соответствуют вашей локали — набору настроек операционной системы для интернационализации. Чтобы вывести на экран другие названия месяцев и дней, измените свою локаль с помощью функции setlocale(): ее первый аргумент должен быть равен locale.LC_TIME для даты и времени, а второй аргумент — это строка, содержащая сокращение языка и страны. Пригласим на нашу вечеринку в честь Дня всех святых наших иностранных друзей. Мы выведем на экран дату (месяц, число и день недели) на английском, французском, немецком, испанском и исландском. (А что? Думаете, исландцы не любят вечеринки? У них даже есть настоящие эльфы.)

>>>> import locale

>>>> from datetime import date

>>>> halloween = date(2014, 10, 31)

>>>> for lang_country in ['en_us', 'fr_fr', 'de_de', 'es_es', 'is_is',]:

>…·····locale.setlocale(locale.LC_TIME, lang_country)

>…·····halloween.strftime('%A, %B %d')

>…

>'en_us'

>'Friday, October 31'

>'fr_fr'

>'Vendredi, octobre 31'

>'de_de'

>'Freitag, Oktober 31'

>'es_es'

>'viernes, octubre 31'

>'is_is'

>'föstudagur, október 31'

>>>>

Откуда можно взять эти волшебные значения аргумента lang_country? Это немного ненадежно, но вы можете получить их все сразу (всего их несколько сотен):

>>>> import locale

>>>> names = locale.locale_alias.keys()

Из переменной names получим только те имена локалей, которые будут работать с методом setlocale(), вроде тех, что мы использовали в предыдущем примере, — двухсимвольный код языка (http://bit.ly/iso-639-1), в котором после подчеркивания следует двухсимвольный код страны (http://bit.ly/iso-3166-1):

>>>> good_names = [name for name in names if \

>len(name) == 5 and name[2] == '_']

Как будут выглядеть первые пять из них?

>>>> good_names[:5]

>['sr_cs', 'de_at', 'nl_nl', 'es_ni', 'sp_yu']

Если вы хотите получить все локали для Германии, используйте следующий код:

>>>> de = [name for name in good_names if name.startswith('de')]

>>>> de

>['de_at', 'de_de', 'de_ch', 'de_lu', 'de_be']

Альтернативные модули

Если вы считаете, что модули стандартной библиотеки только создают путаницу или им не хватает некоторого определенного преобразования, вы можете использовать альтернативные модули от сторонних разработчиков. Рассмотрим несколько из них.

• arrow (http://crsmithdev.com/arrow/). Этот модуль содержит множество функций для работы с датой и временем и имеет простой API.

• dateutil (http://labix.org/python-dateutil). Модуль может проанализировать любой формат даты и хорошо работает с относительными датами и временем.