with codecs.open(sys.argv[5] + ".json", "w", encoding="utf-8") as outfile:
json.dump(fdata, outfile, indent=2, ensure_ascii=False)
Das ist bis jetzt mein Code. Ich möchte die Daten nun beim schreiben komprimieren.
Leider wenn ich gzip.open() benutze kennt er in Python 2.7 noch nicht encoding.
Wie kann ich beides benutzen encoding+zip?
GZip Encoding
@nvidia11: Da das Kodieren vor der Komprimierung passieren muss, ist `codecs.open()` hier eher das Problem. Du müsstest Dir zum Kodieren ein „writer”-Objekt vom `codecs`-Modul holen und dem das `gzip`-Dateiobjekt übergeben.
Hast du da mal ein Beispiel, mit der Doku komm ich nicht ganz klar:
Code: Alles auswählen
# -*- coding: utf-8 -*-
import json
from collections import OrderedDict
import codecs
import gzip
fdata = OrderedDict()
#fdata = {}
fdata[u"Züge"] = 0#data
fdata[u"Bahnhöfe"] = 0#train_stations
with codecs.open("/Users/user/Desktop/Try/trains.json", "w", encoding="utf-8") as outfile:
writer = codecs.getwriter("utf-8")
with gzip.open(writer) as outfile2:
json.dump(fdata, outfile2, indent=2, ensure_ascii=False)
@nvidia11: `codecs.open()` kannst Du gar nicht gebrauchen. Du machst da ja auch gar nichts mit dem `outfile`. Du musst die Datei auf dem Dateisystem mit `gzip.open()` öffnen und *das* Dateiobjekt dann beim Aufruf des „Writer”-Objekts übergeben. Da bekommst Du dann ein dateiähnliches Objekt in das Du das JSON schreiben lassen kannst.
Code: Alles auswählen
with gzip.open("/Users/user/Desktop/Try/trains.json", "w") as outfile:
t = codecs.StreamWriter(outfile)
# t = codecs.s(d, encoding="utf-8")
d = json.dump(fdata, t, indent=2, ensure_ascii=False)
@nvidia11: Die „Writer”-Klasse oder -Fabrikfunktion muss man sich mit `codecs.getwriter()` holen. *Da* gibt man die Kodierung an. Und das Dateiobjekt in das kodiert geschrieben werden soll muss man dann beim Aufrufen des Rückgabewerts von `codecs.getwriter()` übergeben.
Ja ich hab es nun:
Aber es ist viel langsamer als
Kann man dieses ganze noch schneller machen?
Mein Programm tut folgendes:
Struktur aufbauen aus ganz ganz vielen Dicts und Listen.
Dann json.dump aufrufen
dann encoden.
und komprimiert in die Datei schreiben.
------
Parsing file done 10.0 s
JSON 18.0 s
Encoding 18.0 s
Wrting file done 19.0 s
Hier hab ich das mal getestet, wie lange alles dauert.
Kann man das noch JSON aufbauen irgendwie schneller machen, in dem direkt JSON die Elemente übergibt statt sie erstmal separat aufzubauen?
Code: Alles auswählen
writer = codecs.getwriter("utf-8")
with gzip.open("/Users/user/Desktop/Try/trains.json.gz", mode="w") as outfile:
json.dump(fdata, writer(outfile), indent=2, ensure_ascii=False)
Code: Alles auswählen
with gzip.open("/Users/user/Desktop/Try/trains.json.gz", mode="w") as outfile:
b = json.dumps(fdata, indent=2,ensure_ascii=False).encode("utf-8")
outfile.write(b)
Mein Programm tut folgendes:
Struktur aufbauen aus ganz ganz vielen Dicts und Listen.
Dann json.dump aufrufen
dann encoden.
und komprimiert in die Datei schreiben.
------
Parsing file done 10.0 s
JSON 18.0 s
Encoding 18.0 s
Wrting file done 19.0 s
Hier hab ich das mal getestet, wie lange alles dauert.
Kann man das noch JSON aufbauen irgendwie schneller machen, in dem direkt JSON die Elemente übergibt statt sie erstmal separat aufzubauen?
@nvidia11: Zumindest das JSON-Modul aus der Standardbibliothek kann keine JSON-Dokumente ”lazy” erzeugen.