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:

Code: Alles auswählen

>>> js = f.read()
>>> ae = json.loads(js)
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… :shock:

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 :evil: 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.