Seite 1 von 1
GZip Encoding
Verfasst: Sonntag 1. Februar 2015, 23:43
von nvidia11
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?
Re: GZip Encoding
Verfasst: Montag 2. Februar 2015, 00:02
von BlackJack
@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.
Re: GZip Encoding
Verfasst: Montag 2. Februar 2015, 00:16
von nvidia11
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)
Re: GZip Encoding
Verfasst: Montag 2. Februar 2015, 00:52
von BlackJack
@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.
Re: GZip Encoding
Verfasst: Montag 2. Februar 2015, 01:09
von nvidia11
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)
Das hier wirft einen NotImplemented Error und bei codecs.StreamWriter kann ich auch kein Encoding mit angeben???
Re: GZip Encoding
Verfasst: Montag 2. Februar 2015, 01:58
von BlackJack
@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.
Re: GZip Encoding
Verfasst: Dienstag 3. Februar 2015, 23:14
von nvidia11
Ja ich hab es nun:
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)
Aber es ist viel langsamer als
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)
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?
Re: GZip Encoding
Verfasst: Dienstag 3. Februar 2015, 23:46
von BlackJack
@nvidia11: Zumindest das JSON-Modul aus der Standardbibliothek kann keine JSON-Dokumente ”lazy” erzeugen.