23

標準ライブラリにあるPythonのカレンダーモジュールで遊んでいます。基本的に、次のように、月のすべての日のリストが必要です。

>>> import calendar
>>> calobject = calendar.monthcalendar(2012, 10)
>>> print calobject
[[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28], [29, 30, 31, 0, 0, 0, 0]]

ここで必要なのは、特定のロケールでの月と日の名前です。calobjectこれらをそれ自体から取得する方法は見つかりませんでしたが、次のように取得できました。

>>> import calendar
>>> calobject = calendar.LocaleTextCalendar(calendar.MONDAY, 'de_DE')
>>> calobject.formatmonth(2012, 10)
'    Oktober 2012\nMo Di Mi Do Fr Sa So\n 1  2  3  4  5  6  7\n 8  9 10 11 12 13 14\n15 16 17 18 19 20 21\n22 23 24 25 26 27 28\n29 30 31\n'

10月の名前もそうOktoberです。de_DE罰金。情報はそこになければなりません。calendarオブジェクトではなくプレーンなオブジェクトで、その月の名前に何らかの方法でアクセスできるかどうか疑問に思っていcalendar.LocaleTextCalendarます。最初の例 (リストを含む) はまさに私が必要としているものであり、ローカライズされた名前を取得するために 2 つのカレンダー オブジェクトを作成するという考えは好きではありません。

誰でも賢いアイデアを思いつきましたか?

4

3 に答える 3

44

ハ!ローカライズされた日/月の名前を取得する簡単な方法を見つけました:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
'de_DE'
>>> import calendar
>>> calendar.month_name[10]
'Oktober'
>>> calendar.day_name[1]
'Dienstag'
于 2012-10-23T19:31:07.073 に答える
24

これは、calendarモジュールのソース コードからのものです。

def formatmonthname(self, theyear, themonth, width, withyear=True):
    with TimeEncoding(self.locale) as encoding:
        s = month_name[themonth]
        if encoding is not None:
            s = s.decode(encoding)
        if withyear:
            s = "%s %r" % (s, theyear)
        return s.center(width)

TimeEncodingモジュールからmonth_nameインポートできcalendarます。これにより、次のメソッドが得られます。

from calendar import TimeEncoding, month_name

def get_month_name(month_no, locale):
    with TimeEncoding(locale) as encoding:
        s = month_name[month_no]
        if encoding is not None:
            s = s.decode(encoding)
        return s

print get_month_name(3, "nb_NO.UTF-8")

私にとっては、デコード手順は必要ありません。コンテキストで印刷month_name[3]するだけで、TimeEncodingノルウェー語で「行進」を意味する「火星」が印刷されます。

day_name平日には、およびday_abbrdictsを使用した同様の方法があります。

from calendar import TimeEncoding, day_name, day_abbr

def get_day_name(day_no, locale, short=False):
    with TimeEncoding(locale) as encoding:
        if short:
            s = day_abbr[day_no]
        else:
            s = day_name[day_no]
        if encoding is not None:
            s = s.decode(encoding)
        return s
于 2012-10-23T19:05:37.417 に答える