Drucken Sie JSON-Daten mit Python in eine Datei

111

Ein Projekt für die Klasse umfasst das Parsen von Twitter-JSON-Daten. Ich bekomme die Daten und setze sie ohne große Probleme in die Datei, aber es ist alles in einer Zeile. Dies ist in Ordnung für die Datenmanipulation, die ich versuche, aber die Datei ist lächerlich schwer zu lesen und ich kann sie nicht sehr gut untersuchen, was das Schreiben des Codes für den Datenmanipulationsteil sehr schwierig macht.

Weiß jemand, wie man das in Python macht (dh ohne das Kommandozeilen-Tool, mit dem ich nicht arbeiten kann)? Hier ist mein Code bisher:

header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "wb")
# magic happens here to make it pretty-printed
twitterDataFile.write(output)
twitterDataFile.close()

Hinweis: Ich schätze Leute, die mich auf simplejson-Dokumentation und dergleichen hinweisen, aber wie ich bereits sagte, habe ich mir das bereits angesehen und brauche weiterhin Unterstützung. Eine wirklich hilfreiche Antwort ist detaillierter und erklärender als die dort gefundenen Beispiele. Vielen Dank

Außerdem: Versuchen Sie dies in der Windows-Befehlszeile:

more twitterData.json | python -mjson.tool > twitterData-pretty.json

führt dazu:

Invalid control character at: line 1 column 65535 (char 65535)

Ich würde Ihnen die Daten geben, die ich verwende, aber sie sind sehr groß und Sie haben bereits den Code gesehen, mit dem ich die Datei erstellt habe.

Zelbinian
quelle
1
Ich bezweifle, dass Sie tatsächlich Binärdaten ("wb") schreiben möchten
Hamish
Mir wurde beigebracht, dass dies für Windows-Computer notwendig ist und bisher für alle meine Aufgaben funktioniert hat. Wenn Sie eine Dokumentation anbieten können, warum dies möglicherweise falsch ist, würde ich sie mir gerne ansehen.
Zelbinian
Dies ist nur erforderlich, wenn Sie mit Binärdateien arbeiten oder in anderen Fällen, in denen die spezifische Form des Zeilenende (z. B. \r\nvs \n) wichtig ist. Siehe stackoverflow.com/questions/3257869/… . In Ihrem Fall möchten Sie Windows-freundliche Zeilenenden, die Sie jedoch möglicherweise nicht vom Twitter-Endpunkt erhalten. Sie sollten sie daher im Textmodus öffnen.
Hamish
Beantwortet das deine Frage? Wie drucke ich eine JSON-Datei?
wesinat0r

Antworten:

102

Sie sollten das optionale Argument verwenden indent.

header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "w")
# magic happens here to make it pretty-printed
twitterDataFile.write(simplejson.dumps(simplejson.loads(output), indent=4, sort_keys=True))
twitterDataFile.close()
Mattbornski
quelle
1
Danke, das hat perfekt funktioniert . Können Sie erklären, warum "sort_keys" dort drin sein muss?
Zelbinian
1
Es muss nicht da sein, aber es macht die Dinge sehr hübsch und alphabetisch sortiert. Ich neige dazu, es zu verwenden, wenn ich von Menschen lesbare Ausgabe möchte.
Mattbornski
4
Gut erklärt, danke - aber nicht zu versuchen, ein & $ & # zu sein, sondern zu öffnen / schließen, um eine Datei zu schreiben, ist nicht empfehlenswert. Die with-Struktur ist im Allgemeinen vorzuziehen: with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) Vorteil ist, dass Sie sicher sind, dass die Datei geschlossen wird, beispielsweise bei größeren Snippets ...
LogicOnAbstractions
withDie Syntax ist definitiv besser, aber ich versuche, meine Antworten auf mein Publikum zu
skalieren
73

Sie können den JSON analysieren und dann mit folgenden Einzügen erneut ausgeben:

import json
mydata = json.loads(output)
print json.dumps(mydata, indent=4)

Weitere Informationen finden Sie unter http://docs.python.org/library/json.html .

Dkamins
quelle
@ Zelbinian: Ja, es funktioniert auch für simplejson. Schauen Sie hier simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/…
RanRag
Dies führt zu einer leeren Datei. header, output = client.request(twitterRequest, method="GET", body=None, headers=None, force_auth_header=True) twitterDataFile = open("twitterData.json", "wb") json.dumps(json.loads(output), twitterDataFile, indent=4) twitterDataFile.close()
Zelbinian
5
@Zelbinian - json.dumpsgibt einen String zurück. json.dumpschreibt in eine Datei.
Dkamins
64
import json

with open("twitterdata.json", "w") as twitter_data_file:
    json.dump(output, twitter_data_file, indent=4, sort_keys=True)

Sie brauchen nicht, json.dumps()wenn Sie die Zeichenfolge später nicht analysieren möchten, verwenden Sie einfach json.dump(). Es ist auch schneller.

Andras Dosztal
quelle
14

Sie können das json- Modul von Python verwenden, um hübsch zu drucken.

>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
    "4": 5,
    "6": 7
}

Also in deinem Fall

>>> print json.dumps(json_output, indent=4)
RanRag
quelle
Versuchte diese Route und das funktioniert leider nicht so gut, wie Sie denken würden.
Zelbinian
@ Zelbinian: Genau, was meinst du damit doesn't work as well?
RanRag
1
Es gab die Daten in einer einzigen Zeile in einer scheinbar Python-Diktat-Syntax anstelle einer hübsch gedruckten Json-Syntax aus
Zelbinian
Nehmen Sie die Ausgabe als Bearbeitung in Ihre Frage auf. Wir können sie also sehen.
RanRag
Mit dieser Option werden Arrays als viele Zeilen jedes Werts aufgelistet. Es wäre schön, das Array in einer Zeile zu halten.
Scape
4

Wenn Sie bereits JSON-Dateien haben, die Sie hübsch formatieren möchten, können Sie Folgendes verwenden:

    with open('twitterdata.json', 'r+') as f:
        data = json.load(f)
        f.seek(0)
        json.dump(data, f, indent=4)
        f.truncate()
locke14
quelle
3

Wenn Sie eine neue * .json-Datei generieren oder eine vorhandene Josn-Datei ändern, verwenden Sie den Parameter "indent" für das hübsche View-JSON-Format.

import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:    
    json.dump(responseData, twitterDataFile, indent=4)
Praveen SN
quelle
1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  
Peter
quelle
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Tân
-2

Sie können eine Datei nach Python umleiten und mit dem Tool öffnen und zum Lesen mehr verwenden.

Der Beispielcode lautet:

cat filename.json | python -m json.tool | more
Ramya
quelle