Python: Es wird versucht, mehrere JSON-Objekte in einer Datei zu deserialisieren, wobei jedes Objekt mehrere, aber gleichmäßig beabstandete Zeilen umfasst
Ok, nach fast einer Woche recherche habe ich werde Ihnen SO ein Schuss. Ich habe eine text Datei, die wie folgt aussieht (mit den 3 separaten json-Objekte als Beispiel, aber die Datei hat 50K):
{
"zipcode":"00544",
"current":{"canwc":null,"cig":7000,"class":"observation"},
"triggers":[178,30,176,103,179,112,21,20,48,7,50,40,57]
}
{
"zipcode":"00601",
"current":{"canwc":null,"cig":null,"class":"observation"},
"triggers":[12,23,34,28,100]
}
{
"zipcode":"00602",
"current":{"canwc":null,"cig":null,"class":"observation"},
"triggers":[13,85,43,101,38,31]
}
Ich wissen, wie die Arbeit mit JSON-Objekten mit Hilfe der Python-json-Bibliothek, aber ich habe eine Herausforderung, mit, wie man erstellen Sie 50 tausend verschiedene json-Objekte aus der Lektüre der Datei. (Vielleicht bin ich auch nicht über dieses denken richtig, aber letztendlich muss ich zu Deserialisieren und laden in eine Datenbank), die ich ausprobiert habe itertools denken, dass ich brauche einen generator, so war ich in der Lage zu verwenden:
with open(file) as f:
for line in itertools.islice(f, 0, 7): #since every 7 lines is a json object
jfile = json.load(line)
Aber der oben wird offensichtlich nicht funktionieren, da es nicht das Lesen der 7 Linien als eine einzige json-Objekt, und ich bin mir auch nicht sicher, wie iteriere über die gesamte Datei und laden Sie die einzelnen json-Objekte.
Folgende würde mir eine Liste, ich kann slice:
list(open(file))[:7]
Jede Hilfe wäre wirklich zu schätzen.
Extrem nahe, was ich brauche, und ich denke, nur einen Schritt entfernt, aber immer noch etwas Mühe mit iteration. Dies wird endlich mir ein iterativer Ausdruck, der alle dataframes aber wie mache ich es so, dass ich capture one giant dataframe mit allen Stücken im wesentlichen verkettet? Dann konnte ich exportieren, die Letzte dataframe, csv etc. (Auch gibt es eine bessere Möglichkeit zum hochladen dieses Ergebnis in einer Datenbank, anstatt ein Riesen dataframe zuerst?)
def lines_per_n(f, n):
for line in f:
yield ''.join(chain([line], itertools.islice(f, n - 1)))
def flatten(jfile):
for k, v in jfile.items():
if isinstance(v, list):
jfile[k] = ','.join(v)
elif isinstance(v, dict):
for kk, vv in v.items():
jfile['%s' % (kk)] = vv
del jfile[k]
return jfile
with open('deadzips.json') as f:
for chunk in lines_per_n(f, 7):
try:
jfile = json.loads(chunk)
pd.DataFrame(flatten(jfile).items())
except ValueError, e:
pass
else:
pass
InformationsquelleAutor der Frage horatio1701d | 2013-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laden 6 zusätzliche Linien statt, und übergeben Sie die string zu
json.loads()
:json.load()
wird slurp mehr als nur das nächste Objekt in der Datei, undislice(f, 0, 7)
würde, Lesen nur die ersten 7 Zeilen, anstatt Lesen der Datei in 7-Linie blockiert.Können Sie wickeln Sie das Lesen einer Datei in Blöcke der Größe N in a generator:
dann verwenden, um chunk up your input file:
Alternativ, wenn Ihr die Blöcke drehen, um eine variable Länge, zu Lesen, bis Sie etwas haben, das analysiert:
InformationsquelleAutor der Antwort Martijn Pieters
Wie gesagt, anderswo, die eine Allgemeine Lösung ist, die Datei zu Lesen, in Stücke, fügen Sie jedes Stück, um die Letzte, und versuchen zu analysieren, das neue Stück. Wenn es nicht analysieren, weiter, bis Sie etwas, dass nicht. Sobald Sie etwas haben, das analysiert, bringen Sie es, und starten Sie den Vorgang. Ausspülen-Schaum-wiederholen Sie, bis Sie laufen aus Daten.
Hier ist eine prägnante generator, der dies tun wird:
Verwenden Sie es wie diese:
Ich hoffe, das hilft.
InformationsquelleAutor der Antwort Jeff Younker