Seite 1 von 1
UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 09:45
von mutetella
Hallo,
um ein json Objekt UTF8 kodiert zu speichern, gehe ich so vor...
Code: Alles auswählen
>>> ae = u'ä'
>>> js = json.dumps(ae, ensure_ascii=False)
>>> f.write(js.encode('utf8'))
... um es zu lesen so:
Bisher habe ich damit keine Probleme, bin mir aber unsicher, ob der Umweg über `write` und `read` in Ordnung ist. Letztlich möchte ich meine Daten als UTF8 Datei, die dann als solche auch "von außen" editierbar ist, vorliegen haben.
Ich bin da jetzt nicht auf json festgelegt. Welches Format würdet ihr wählen, um Kalenderdaten in einer halbwegs durchschaubaren Struktur als Text zu speichern?
mutetella
Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 12:59
von BlackJack
@mutetella: Warum gehst Du diesen Umweg?
Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 13:42
von Hyperion
Code: Alles auswählen
with open("json_test.js", "w", encoding="utf-8") as f:
json.dump(u"ä", f, ensure_ascii=False)
schreibt bei mir (Python 3.3.3) ein sauber UTF-8 codiertes Zeichen in die Datei

Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 15:52
von mutetella
@Hyperion:
Leider ist die Angabe einer Dateikodierung bei `open()` erst ab Python 3 möglich.
@BlackJack:
Weil ich sonst alle unicode Kalenderdaten vor einem `json.dump` nach UTF8 kodieren muss.
mutetella
Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 15:57
von lunar
@mutetella "from codecs import open" in Python 2

Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 18:03
von mutetella
@lunar: Ok, damit klappts, danke!
mutetella
Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 18:39
von BlackJack
@mutetella: Das ist doch aber überhaupt nicht nötig! Einfach Datei öffnen mit normalem `open()` (und Binärmodus) und dann mit `json.dump()` da rein speichern. Halt auch mit dem Argument das er kein ASCII schreiben soll. `codecs.open()` braucht man dafür nicht. Ich habe immer noch nicht verstanden welches *Problem* Du eigentlich lösen willst‽
Code: Alles auswählen
with open('test.json', 'wb') as json_file:
json.dump(u'ä', json_file, ensure_ascii=False)
Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 20:55
von mutetella
BlackJack hat geschrieben: Ich habe immer noch nicht verstanden welches *Problem* Du eigentlich lösen willst‽
Keine Ahnung, welches Problem ich hab:
Code: Alles auswählen
Python 2.7.5+ (default, Sep 17 2013, 15:31:50)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> f = open('bla', 'wb')
>>> json.dump(u'ä', f, ensure_ascii=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/json/__init__.py", line 190, in dump
fp.write(chunk)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1: ordinal not in range(128)
Code: Alles auswählen
Python 3.3.3 (default, Nov 27 2013, 17:12:35)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> f = open('bla', 'wb')
>>> json.dump(u'ä', f, ensure_ascii=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.3/json/__init__.py", line 184, in dump
fp.write(chunk)
TypeError: 'str' does not support the buffer interface
mutetella
Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 21:10
von BlackJack
@mutetella: Okay, das war mir neu. Warum zur Hölle hat `json.dump()` dann ein `encoding`-Argument mit dem Default-Wert 'UTF-8'? Das ist dann ja total sinnfrei…

Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Freitag 13. Dezember 2013, 22:03
von mutetella
@BlackJack:
Deshalb bin ich den Umweg über `json.dumps` gegangen und hab' das Ergebnis dann kodiert und abgespeichert. Das Kodieren kann ich mir durch `codecs.open` inzwischen sparen.
mutetella
Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Samstag 14. Dezember 2013, 11:43
von Sirius3
Ich bin genauso verwirrt wie BlackJack. Kann mir irgendwer den Sinn der Optionen von json.dump erklären?
- ensure_ascii=False liefert einen
Unicode-String den ein normales Fileobjekt nicht schreiben kann.
- ensure_ascii=True liefert reinen ASCII-String.
In beiden Fällen brauche ich
kein Encoding. Für was zum

braucht die Funktion dann eine »encoding«-Option?
Re: UTF8 kodierte json Datei nur über Umweg machbar?
Verfasst: Samstag 14. Dezember 2013, 12:01
von BlackJack
@Sirius3: Ich glaub ich hab's: Man kann nicht nur `unicode`- sondern auch `str`-Objekte in der Struktur haben die man damit serialisiert, und diese Bytezeichenketten werden mit der angegebenen Kodierung *de*kodiert, weil JSON letztendlich ja als Unicode definiert ist und man sonst nur ASCII in `str`-Objekten haben dürfte.