GZip Encoding

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
nvidia11
User
Beiträge: 11
Registriert: Montag 8. Dezember 2014, 00:29

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?
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.
nvidia11
User
Beiträge: 11
Registriert: Montag 8. Dezember 2014, 00:29

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)
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.
nvidia11
User
Beiträge: 11
Registriert: Montag 8. Dezember 2014, 00:29

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???
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.
nvidia11
User
Beiträge: 11
Registriert: Montag 8. Dezember 2014, 00:29

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?
BlackJack

@nvidia11: Zumindest das JSON-Modul aus der Standardbibliothek kann keine JSON-Dokumente ”lazy” erzeugen.
Antworten