Wie kann ich JSON-Daten in eine Datei schreiben?

Ich habe JSON-Daten in der Variablen "data" gespeichert.

Ich möchte diese Daten zum Testen in eine Textdatei schreiben, damit ich nicht jedes Mal die Daten vom Server abrufen muss.

Derzeit versuche ich dies:

obj = open('data.txt', 'wb')
obj.write(data)
obj.close

Und erhalte die Fehlermeldung:

TypeError: muss string oder buffer sein, nicht dict

Wie kann ich das beheben?

Lösung

Sie haben den eigentlichen JSON-Teil vergessen - data ist ein Wörterbuch und noch nicht JSON-kodiert. Schreiben Sie es wie folgt für maximale Kompatibilität (Python 2 und 3):

import json
with open('data.json', 'w') as f:
    json.dump(data, f)

Auf einem modernen System (d.h. Python 3 und UTF-8 Unterstützung) können Sie eine schönere Datei schreiben mit

import json
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)
Kommentare (21)

Um eine utf8-kodierte Datei zu erhalten, im Gegensatz zu ascii-kodiert in der akzeptierten Antwort für Python 2, verwenden Sie:

import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
  f.write(json.dumps(data, ensure_ascii=False))

Der Code ist in Python 3 einfacher:

import json
with open('data.txt', 'w') as f:
  json.dump(data, f, ensure_ascii=False)

Unter Windows ist das Argument encoding='utf-8' für open immer noch notwendig.

Um die Speicherung einer kodierten Kopie der Daten im Speicher zu vermeiden (Ergebnis von dumps) und um utf8-kodierte Bytestrings sowohl in Python 2 als auch in 3 auszugeben, verwenden Sie:

import json, codecs
with open('data.txt', 'wb') as f:
    json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)

Der Aufruf codecs.getwriter ist in Python 3 überflüssig, aber für Python 2 erforderlich


Lesbarkeit und Größe:

Die Verwendung von ensure_ascii=False führt zu besserer Lesbarkeit und geringerer Größe:

>>> json.dumps({'price': '€10'})
'{"price": "\\u20ac10"}'
>>> json.dumps({'price': '€10'}, ensure_ascii=False)
'{"price": "€10"}'

>>> len(json.dumps({'абвгд': 1}))
37
>>> len(json.dumps({'абвгд': 1}, ensure_ascii=False).encode('utf8'))
17

Verbessern Sie die Lesbarkeit weiter, indem Sie die Flags indent=4, sort_keys=True (wie von dinos66 vorgeschlagen) zu den Argumenten von dump oder dumps hinzufügen. Auf diese Weise erhalten Sie eine schön eingerückte, sortierte Struktur in der json-Datei, allerdings auf Kosten einer etwas größeren Dateigröße.

Kommentare (18)

Ich würde mit einer leichten Änderung der oben genannten Antworten antworten, und zwar, indem ich eine aufgehübschte JSON-Datei schreibe, die von menschlichen Augen besser gelesen werden kann. Dazu geben Sie sort_keys als True und indent mit 4 Leerzeichen an und schon sind Sie startklar. Achten Sie auch darauf, dass die Ascii-Codes nicht in Ihre JSON-Datei geschrieben werden:

with open('data.txt', 'w') as outfile:
     json.dump(jsonData, outfile, sort_keys = True, indent = 4,
               ensure_ascii = False)
Kommentare (5)