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