it-swarm.com.de

Wie schreibe ich JSON-Daten in eine Datei?

Ich habe JSON-Daten in der Variablen data gespeichert.

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

Derzeit versuche ich Folgendes:

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

Und erhalte den Fehler:

TypeError: must be string or buffer, not dict

Wie kann man das beheben?

951
user1530318

Sie haben den eigentlichen JSON-Teil vergessen - data ist ein Wörterbuch und noch nicht JSON-codiert. Schreiben Sie es so 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 mit eine schönere Datei schreiben

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

utf8 - codierte Datei im Gegensatz bis ascii - codiert 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 weiterhin erforderlich.

Um zu vermeiden, dass eine verschlüsselte Kopie der Daten im Speicher abgelegt wird (Ergebnis von dumps), und um utf8-verschlüsselte Bytestrings sowohl in Python 2 als auch in _ auszugeben 3, verwenden Sie:

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

Der codecs.getwriter -Aufruf ist in Python 3 redundant, wird jedoch für Python 2 benötigt.


Lesbarkeit und Größe:

Die Verwendung von ensure_ascii=False bietet eine bessere Lesbarkeit und eine kleinere 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, indem Sie Flags indent=4, sort_keys=True (wie von dinos66 vorgeschlagen) zu Argumenten von dump oder dumps hinzufügen. Auf diese Weise erhalten Sie eine gut eingerückte, sortierte Struktur in der JSON-Datei zu Lasten einer etwas größeren Datei.

248

Ich würde mit geringfügiger Änderung mit den oben genannten Antworten antworten und das ist, eine hübsche JSON-Datei zu schreiben, die das menschliche Auge besser lesen kann. Übergeben Sie dazu sort_keys als True und indent mit 4 Leerzeichen und Sie können loslegen. Stellen Sie außerdem sicher, 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)
156
ambodi

Lesen und schreiben Sie JSON-Dateien mit Python 2 + 3; arbeitet mit Unicode

_# -*- coding: utf-8 -*-
import json

# Make it work for Python 2+3 and with Unicode
import io
try:
    to_unicode = unicode
except NameError:
    to_unicode = str

# Define data
data = {'a list': [1, 42, 3.141, 1337, 'help', u'€'],
        'a string': 'bla',
        'another dict': {'foo': 'bar',
                         'key': 'value',
                         'the answer': 42}}

# Write JSON file
with io.open('data.json', 'w', encoding='utf8') as outfile:
    str_ = json.dumps(data,
                      indent=4, sort_keys=True,
                      separators=(',', ': '), ensure_ascii=False)
    outfile.write(to_unicode(str_))

# Read JSON file
with open('data.json') as data_file:
    data_loaded = json.load(data_file)

print(data == data_loaded)
_

Erklärung der Parameter von json.dump :

  • indent: Verwenden Sie 4 Leerzeichen, um jeden Eintrag einzurücken, z. wenn ein neues Diktat gestartet wird (ansonsten stehen alle in einer Zeile),
  • _sort_keys_: Sortiert die Schlüssel der Wörterbücher. Dies ist nützlich, wenn Sie JSON-Dateien mit einem Diff-Tool vergleichen oder der Versionskontrolle unterwerfen möchten.
  • separators: Um zu verhindern, dass Python nachgestellte Leerzeichen hinzufügt

Mit einem Paket

Schauen Sie sich mein Hilfsprogramm an mpu für ein supereinfaches und leicht zu merkendes:

_import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)
_

Erstellt JSON-Datei

_{
    "a list":[
        1,
        42,
        3.141,
        1337,
        "help",
        "€"
    ],
    "a string":"bla",
    "another dict":{
        "foo":"bar",
        "key":"value",
        "the answer":42
    }
}
_

Gemeinsame Dateiendungen

_.json_

Alternativen

Für Ihre Anwendung kann Folgendes wichtig sein:

  • Unterstützung durch andere Programmiersprachen
  • Lese-/Schreibleistung
  • Kompaktheit (Dateigröße)

Siehe auch: Vergleich von Datenserialisierungsformaten

Falls Sie lieber nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, lesen Sie meinen kurzen Artikel Konfigurationsdateien in Python

102
Martin Thoma

Für diejenigen unter Ihnen, die versuchen, Griechisch oder andere "exotische" Sprachen wie mich zu entleeren, aber auch Probleme (Unicode-Fehler) mit seltsamen Zeichen wie dem Friedenssymbol (\ u262E) oder anderen haben, die häufig in json-formatierten Daten enthalten sind Wie bei Twitter könnte die Lösung folgendermaßen aussehen (sort_keys ist offensichtlich optional):

import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
     f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))
21
dinos66

Ich habe nicht genug Reputation, um Kommentare hinzuzufügen, deshalb schreibe ich hier nur einige meiner Erkenntnisse zu diesem nervigen TypeError:

Grundsätzlich denke ich, es ist ein Fehler in der Funktion json.dump() in Python 2 - Es kann kein Python (Wörterbuch/Liste) ausgegeben werden ) Daten mit Nicht-ASCII-Zeichen, sogar Sie öffnen die Datei mit dem Parameter encoding = 'utf-8'. (d. h. egal was Sie tun). Aber json.dumps() funktioniert sowohl für Python 2 als auch für _ 3.

Um dies zu veranschaulichen, folgt man der Antwort von Phihag: Der Code in seiner Antwort bricht Python 2 mit Ausnahme von TypeError: must be unicode, not str ein, wenn data Nicht-ASCII-Zeichen enthält. (Python 2.7.6, Debian):

import json
data = {u'\u0430\u0431\u0432\u0433\u0434': 1} #{u'абвгд': 1}
with open('data.txt', 'w') as outfile:
    json.dump(data, outfile)

Es funktioniert jedoch gut in Python 3.

10
ibic

Schreiben Sie Daten in eine Datei mit JSON, indem Sie json.dump () oder json.dumps () verwenden. Schreiben Sie wie folgt, um Daten in einer Datei zu speichern.

import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
    json.dump(data, txtfile)

dieses Beispiel in der Liste wird in einer Datei gespeichert.

7
Vishal Gediya
json.dump(data, open('data.txt', 'wb'))
4
Alexander

So schreiben Sie den JSON-Code mit Einzug "pretty print":

import json

outfile = open('data.json')
json.dump(data, outfile, indent=4)

Wenn Sie ein Debugging für falsch formatiertes JSON durchführen müssen und eine hilfreiche Fehlermeldung erhalten möchten, verwenden Sie die Bibliothek import simplejson anstelle von import json (Funktionen sollten identisch sein).

3
James Wierzba

wenn Sie versuchen, einen pandas -Datenrahmen in eine Datei mit einem JSON-Format zu schreiben, würde ich dies empfehlen

destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()

Alle vorherigen Antworten sind richtig. Hier ist ein sehr einfaches Beispiel:

#! /usr/bin/env python
import json

def write_json():
    # create a dictionary  
    student_data = {"students":[]}
    #create a list
    data_holder = student_data["students"]
    # just a counter
    counter = 0
    #loop through if you have multiple items..         
    while counter < 3:
        data_holder.append({'id':counter})
        data_holder.append({'room':counter})
        counter += 1    
    #write the file        
    file_path='/tmp/student_data.json'
    with open(file_path, 'w') as outfile:
        print("writing file to: ",file_path)
        # HERE IS WHERE THE MAGIC HAPPENS 
        json.dump(student_data, outfile)
    outfile.close()     
    print("done")

write_json()

enter image description here

1
grepit

Die JSON-Daten können wie folgt in eine Datei geschrieben werden

hist1 = [{'val_loss': [0.5139984398465246],
'val_acc': [0.8002029867684085],
'loss': [0.593220705309384],
'acc': [0.7687131817929321]},
{'val_loss': [0.46456472964199463],
'val_acc': [0.8173602046780344],
'loss': [0.4932038113037539],
'acc': [0.8063946213802453]}]

In eine Datei schreiben:

with open('text1.json', 'w') as f:
     json.dump(hist1, f)

Die akzeptierte Antwort ist in Ordnung. Allerdings lief ich in "ist nicht json serialisierbar" Fehler damit.

So habe ich es mit open("file-name.json", 'w') als Ausgabe behoben:

output.write(str(response))

Es ist zwar keine gute Lösung, da die erstellte JSON-Datei keine doppelten Anführungszeichen enthält, aber es ist großartig, wenn Sie schnell und schmutzig suchen.

1
Akshat Bajaj