Monatszahl, Monatsname als Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 9. Februar 2009, 14:29

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Montag 9. Februar 2009, 14:47

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 9. Februar 2009, 14:55

Hallo,

die LC_TIME kann sich ändern

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
snafu
User
Beiträge: 5537
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Montag 9. Februar 2009, 14:56

Und dann vielleicht besser ein Dictionary?
shcol (Repo | Doc | PyPi)
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Montag 9. Februar 2009, 15:00

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 9. Februar 2009, 15:07

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Montag 9. Februar 2009, 15:11

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 9. Februar 2009, 15:54

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'
Zuletzt geändert von Twilo am Montag 9. Februar 2009, 15:56, insgesamt 1-mal geändert.
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 9. Februar 2009, 15:55

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Montag 9. Februar 2009, 16:29

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')]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 9. Februar 2009, 20:16

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 9. Februar 2009, 20:26

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Montag 9. Februar 2009, 22:05

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
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Montag 9. Februar 2009, 22:28

Hmm. Hier sagt man zu "Januar" aber "Jaenner", und afaik ist "Feber" fuer "Februar" in manchen Gegenden auch gelaeufig...
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Montag 9. Februar 2009, 22:41

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
Antworten