Seite 1 von 1

Monatszahl, Monatsname als Liste

Verfasst: Montag 9. Februar 2009, 14:29
von Twilo
Hallo,

ich möchte eine Liste mit Monatszahl und Monatsnamen haben
gibt es dafür eine einfachere Lösung als diese?

Code: Alles auswählen

import locale
locale.setlocale(locale.LC_TIME, "de_DE")
months = [(i, time.strftime("%B", time.localtime(time.mktime((2009, i, 1, 0, 0, 0, 0, 0, 0))))) for i in range(1,13)]
mfg
Twilo

Verfasst: Montag 9. Februar 2009, 14:47
von rayo
Hi

Wenn du sowieso immer locale=de_DE hast, kannst du das auch so machen:

Code: Alles auswählen

months = [
    (1, 'Januar'),
    (2, 'Februar'),
    (3, 'März'),
    (4, 'April'),
    (5, 'Mai'),
    (6, 'Juni'),
    (7, 'Juli'),
    (8, 'August'),
    (9, 'September'),
    (10, 'Oktober'),
    (11, 'November'),
    (12, 'Dezember'),
]
Die Namen ändern sich ja nicht gerade oft ;).

Gruss

Verfasst: Montag 9. Februar 2009, 14:55
von Twilo
Hallo,

die LC_TIME kann sich ändern

mfg
Twilo

Verfasst: Montag 9. Februar 2009, 14:56
von snafu
Und dann vielleicht besser ein Dictionary?

Verfasst: Montag 9. Februar 2009, 15:00
von hendrikS
Ich weiss nicht genau in welchem Zusammenhang Du das brauchst. Möglicherweise hilft Dir enumerate auch schon weiter.

Code: Alles auswählen

a=["Januar","Februar","Maerz"]
for i,j in enumerate(a):print i,j

Verfasst: Montag 9. Februar 2009, 15:07
von Twilo
Hallo,
snafu hat geschrieben:Und dann vielleicht besser ein Dictionary?
meinst du ein Dictionary, das für jede Sprache die Monatsnamen speichert?

hendrikS hat geschrieben:Ich weiss nicht genau in welchem Zusammenhang Du das brauchst. Möglicherweise hilft Dir enumerate auch schon weiter.

Code: Alles auswählen

a=["Januar","Februar","Maerz"]
for i,j in enumerate(a):print i,j
bei diesen Beispiel, hab ich dann aber imemr nur die deitschen Namen. Die Ausgabe ist auch um 1 zu klein - Januar hat die 0.

mfg
Twilo

Verfasst: Montag 9. Februar 2009, 15:11
von rayo
Also wenn du locale braucht, was ist denn an deiner Lösung nicht gut?

Ich würde aber die Monatsnummer weglassen, da diese einfach der Index+1 ist (enumerate einfach i+1 machen).

Gruss

Verfasst: Montag 9. Februar 2009, 15:54
von Twilo
Hallo,

wie bekomme ich 'M\xe4rz' nach utf-8, gzw. wie kann ich den String als unicode kennzeichnen, damit ich encode() verwenden kann?

Code: Alles auswählen

In [1]: 'M\xe4rz'.encode("utf-8")
---------------------------------------------------------------------------
<type 'exceptions.UnicodeDecodeError'>    Traceback (most recent call last)

/home/khaeusler/<ipython console> in <module>()

<type 'exceptions.UnicodeDecodeError'>: 'ascii' codec can't decode byte 0xe4 in position 1: ordinal not in range(128)

In [2]: u'M\xe4rz'.encode("utf-8")
Out[2]: 'M\xc3\xa4rz'

Verfasst: Montag 9. Februar 2009, 15:55
von Twilo
Hallo,
rayo hat geschrieben:Also wenn du locale braucht, was ist denn an deiner Lösung nicht gut?
evtl. gibt es eine vorhandene python-Methode, welche alle Monatsnamen ausgibt.

mfg
Twilo

Verfasst: Montag 9. Februar 2009, 16:29
von derdon
Hier eine Möglichkeit mit babel:

Code: Alles auswählen

>>> from pprint import pprint
>>> from babel import Locale
>>> locale = Locale('de')
>>> pprint(locale.months['format']['wide'].items())
[(1, u'Januar'),
 (2, u'Februar'),
 (3, u'M\xe4rz'),
 (4, u'April'),
 (5, u'Mai'),
 (6, u'Juni'),
 (7, u'Juli'),
 (8, u'August'),
 (9, u'September'),
 (10, u'Oktober'),
 (11, u'November'),
 (12, u'Dezember')]

Verfasst: Montag 9. Februar 2009, 20:16
von Leonidas
Twilo hat geschrieben:wie bekomme ich 'M\xe4rz' nach utf-8, gzw. wie kann ich den String als unicode kennzeichnen, damit ich encode() verwenden kann?
``decode`` verwenden. Du hast einen Bytestring. Um diesen Bytestring in Unicode zu konvertieren brauchst du ``decode``. Um einen Unicode-String in einen Bytestring zu konvertieren brauchst du ``encode``.

Was bei ``M\xe4rz'.encode("utf-8")`` ist eigentlich ``M\xe4rz'.decode('ascii').encode("utf-8")`` und das geht nunmal nicht. Eigentlich ist ``encode`` auf Bytestrings ziemlicher Blödsinn und führt außerhalb Amerikas (ASCII) zu mehr Fehlern als es löst.

Verfasst: Montag 9. Februar 2009, 20:26
von Twilo
Hallo,
Leonidas hat geschrieben:
Twilo hat geschrieben:wie bekomme ich 'M\xe4rz' nach utf-8, gzw. wie kann ich den String als unicode kennzeichnen, damit ich encode() verwenden kann?
``decode`` verwenden. Du hast einen Bytestring. Um diesen Bytestring in Unicode zu konvertieren brauchst du ``decode``. Um einen Unicode-String in einen Bytestring zu konvertieren brauchst du ``encode``..
das ist mir soweit klar :)

Code: Alles auswählen

In [2]: 'M\xe4rz'.decode("latin_1").encode("utf-8")
Out[2]: 'M\xc3\xa4rz'
Ist nur die Frage, ob time.strftime immer in latin_1 codiert.

mfg
Twilo

Verfasst: Montag 9. Februar 2009, 22:05
von derdon
Wenn du das Beispiel mit Babel (siehe oben) verwendest, dann arbeitest du gleich mit Unicode, brauchst also kein decode machen:

Code: Alles auswählen

In [79]: from babel import Locale

In [80]: locale = Locale('de')

In [81]: for month in locale.months['format']['wide'].itervalues():
    print 'Unicode: %(month_unicode)r, UTF-8: %(month)r in der Ausgabe: %(month)s' % {
        'month_unicode': month,
        'month': month.encode('utf-8')
    }
   ....:     
   ....:     
Unicode: u'Januar', UTF-8: 'Januar' in der Ausgabe: Januar
Unicode: u'Februar', UTF-8: 'Februar' in der Ausgabe: Februar
Unicode: u'M\xe4rz', UTF-8: 'M\xc3\xa4rz' in der Ausgabe: März
Unicode: u'April', UTF-8: 'April' in der Ausgabe: April
Unicode: u'Mai', UTF-8: 'Mai' in der Ausgabe: Mai
Unicode: u'Juni', UTF-8: 'Juni' in der Ausgabe: Juni
Unicode: u'Juli', UTF-8: 'Juli' in der Ausgabe: Juli
Unicode: u'August', UTF-8: 'August' in der Ausgabe: August
Unicode: u'September', UTF-8: 'September' in der Ausgabe: September
Unicode: u'Oktober', UTF-8: 'Oktober' in der Ausgabe: Oktober
Unicode: u'November', UTF-8: 'November' in der Ausgabe: November
Unicode: u'Dezember', UTF-8: 'Dezember' in der Ausgabe: Dezember

Verfasst: Montag 9. Februar 2009, 22:28
von name
Hmm. Hier sagt man zu "Januar" aber "Jaenner", und afaik ist "Feber" fuer "Februar" in manchen Gegenden auch gelaeufig...

Verfasst: Montag 9. Februar 2009, 22:41
von derdon
OK, hier noch einmal für alle Österreicher und besonders für name (hoffentlich meckern jetzt nicht die Schweizer):

Code: Alles auswählen

In [146]: locale = Locale('de','AT')

In [147]: for month in locale.months['format']['wide'].itervalues():
    print 'Unicode: %(month_unicode)r, UTF-8: %(month)r in der Ausgabe: %(month)s' % {
        'month_unicode': month,
        'month': month.encode('utf-8')
    }
   .....:     
   .....:     
Unicode: u'J\xe4nner', UTF-8: 'J\xc3\xa4nner' in der Ausgabe: Jänner
Unicode: u'Februar', UTF-8: 'Februar' in der Ausgabe: Februar
Unicode: u'M\xe4rz', UTF-8: 'M\xc3\xa4rz' in der Ausgabe: März
Unicode: u'April', UTF-8: 'April' in der Ausgabe: April
Unicode: u'Mai', UTF-8: 'Mai' in der Ausgabe: Mai
Unicode: u'Juni', UTF-8: 'Juni' in der Ausgabe: Juni
Unicode: u'Juli', UTF-8: 'Juli' in der Ausgabe: Juli
Unicode: u'August', UTF-8: 'August' in der Ausgabe: August
Unicode: u'September', UTF-8: 'September' in der Ausgabe: September
Unicode: u'Oktober', UTF-8: 'Oktober' in der Ausgabe: Oktober
Unicode: u'November', UTF-8: 'November' in der Ausgabe: November
Unicode: u'Dezember', UTF-8: 'Dezember' in der Ausgabe: Dezember