Ich habe JSON-Daten in der Variablen gespeichert data
.
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 ich erhalte diesen Fehler:
TypeError: muss Zeichenfolge oder Puffer sein, nicht diktieren
Wie kann ich das beheben?
json.dump
schreibt in eine Datei oder ein dateiähnliches Objekt, währendjson.dumps
eine Zeichenfolge zurückgegeben wird.json.dump
Schreibt unter Python 3 in eine Textdatei, nicht in eine Binärdatei. Sie würden eine erhalten,TypeError
wenn die Datei mit geöffnet wurdewb
. Bei älteren Python-Versionenw
funktionieren beide nandwb
. Eine explizite Codierung ist nicht erforderlich, da die Ausgabejson.dump
von standardmäßig nur ASCII ist. Wenn Sie sicher sein können, dass Ihr Code niemals in älteren Python-Versionen ausgeführt wird und Sie und der Handler der JSON-Datei Nicht-ASCII-Daten korrekt verarbeiten können, können Sie eine angeben und festlegenensure_ascii=False
.Um UTF - 8 - kodierte Datei im Gegensatz zu ascii - codiertes in der akzeptierten Antwort für Python 2 Verwendung:
Der Code ist in Python 3 einfacher:
Unter Windows ist das
encoding='utf-8'
Argument toopen
weiterhin erforderlich.Verwenden Sie Folgendes, um zu vermeiden, dass eine codierte Kopie der Daten im Speicher gespeichert wird (Ergebnis von
dumps
) und utf8-codierte Bytestrings in Python 2 und 3 auszugeben.Der
codecs.getwriter
Aufruf ist in Python 3 redundant, für Python 2 jedoch erforderlichLesbarkeit und Größe:
Die Verwendung von
ensure_ascii=False
bietet eine bessere Lesbarkeit und eine kleinere Größe:Weitere Verbesserung der Lesbarkeit durch Hinzufügen von Flags
indent=4, sort_keys=True
(wie von dinos66 vorgeschlagen ) zu Argumenten vondump
oderdumps
. Auf diese Weise erhalten Sie eine gut eingerückte sortierte Struktur in der JSON-Datei auf Kosten einer etwas größeren Datei.quelle
unicode
ist überflüssig - das Ergebnis vonjson.dumps
ist bereits ein Unicode-Objekt. Beachten Sie, dass dies in 3.x fehlschlägt, wo das gesamte Durcheinander des Ausgabedateimodus bereinigt wurde und json immer Zeichenfolgen (und Zeichen-E / A) und niemals Bytes verwendet.type(json.dumps('a'))
ist<type 'str'>
. Auchtype(json.dumps('a', encoding='utf8'))
ist<type 'str'>
.utf8
auch in 3.x wollen . Die Antwort wurde aktualisiert.'ascii' codec can't decode byte 0xf1 in position 506755: ordinal not in range(128)
. Verwenden Sie im Zweifelsfall die 3.x-Antwort!Ich würde mit geringfügigen Änderungen mit den oben genannten Antworten antworten und das heißt, eine hübsche JSON-Datei schreiben, die das menschliche Auge besser lesen kann. Übergeben Sie dies
sort_keys
alsTrue
undindent
mit 4 Leerzeichen und Sie können loslegen. Stellen Sie außerdem sicher, dass die ASCII-Codes nicht in Ihre JSON-Datei geschrieben werden:quelle
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc'
# -*- coding: utf-8 -*-
nach demUnicodeEncodeError
mit Nicht-ASCII-Daten). Siehe meine Lösung für Details.Lesen und Schreiben von JSON-Dateien mit Python 2 + 3; funktioniert mit Unicode
Erläuterung der Parameter von
json.dump
:indent
: Verwenden Sie 4 Leerzeichen, um jeden Eintrag einzurücken, z. B. wenn ein neues Diktat gestartet wird (andernfalls werden alle in einer Zeile stehen).sort_keys
: sortiere die Schlüssel der Wörterbücher. Dies ist nützlich, wenn Sie JSON-Dateien mit einem Diff-Tool vergleichen / unter Versionskontrolle stellen möchten.separators
: Um zu verhindern, dass Python nachgestellte Leerzeichen hinzufügtMit einem Paket
Schauen Sie sich mein Dienstprogramm an,
mpu
um ein supereinfaches und leicht zu merkendes zu erhalten:JSON-Datei erstellt
Allgemeine Dateienden
.json
Alternativen
Für Ihre Anwendung kann Folgendes wichtig sein:
Siehe auch: Vergleich der Datenserialisierungsformate
Wenn Sie eher nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, lesen Sie möglicherweise meinen kurzen Artikel Konfigurationsdateien in Python
quelle
force_ascii
FlagTrue
standardmäßig ist. Sie haben unlesbare 6-Byte-"\u20ac"
Sequenzen für jede€
in Ihrer JSON-Datei (sowie für jedes andere Nicht-ASCII-Zeichen).open
zum Lesen, aberio.open
zum Schreiben? Kann man es auch zumio.open
Lesen verwenden? Wenn ja, welche Parameter sollten übergeben werden?Für diejenigen unter Ihnen, die versuchen, Griechisch oder andere "exotische" Sprachen wie mich zu löschen, aber auch Probleme (Unicode-Fehler) mit seltsamen Zeichen wie dem Friedenssymbol (\ u262E) oder anderen haben, die häufig in json-formatierten Daten enthalten sind Bei Twitter könnte die Lösung wie folgt aussehen (sort_keys ist offensichtlich optional):
quelle
open
und das Assoziatedio.open
Over empfiehltcodecs.open
, ist es in diesem Fall auch ein netter abwärtskompatibler Hack. In Python2codecs.open
ist es "alles fressender" als io.open (es kann sowohl str als auch unicode "essen" und bei Bedarf konvertieren). Man kann sagen, dass diesecodecs.open
Eigenart diejson.dumps
Eigenart der Erzeugung verschiedener Objekttypen (str
/unicode
) in Abhängigkeit vom Vorhandensein der Unicode-Zeichenfolgen in der Eingabe kompensiert .Ich habe nicht genug Ruf, um Kommentare hinzuzufügen, deshalb schreibe ich hier nur einige meiner Ergebnisse dieses nervigen TypeError:
Grundsätzlich denke ich, dass es nur
json.dump()
in Python 2 ein Fehler in der Funktion ist - es kann keine Python-Daten (Wörterbuch / Liste) ausgeben, die Nicht-ASCII-Zeichen enthalten, selbst wenn Sie die Datei mit demencoding = 'utf-8'
Parameter öffnen . (dh egal was du tust). Funktioniert jedochjson.dumps()
sowohl mit Python 2 als auch mit Python 3.Um dies zu veranschaulichen, folgen Sie der Antwort von phihag: Der Code in seiner Antwort bricht in Python 2 mit Ausnahme
TypeError: must be unicode, not str
, wenn erdata
Nicht-ASCII-Zeichen enthält. (Python 2.7.6, Debian):In Python 3 funktioniert es jedoch einwandfrei.
quelle
data = {'asdf': 1}
.TypeError
Mit Ihrer (zweiten) Variante werden Sie berüchtigt .ensure_ascii
- es ist notwendig, wenn Sie eine "echte" utf8-Ausgabe erhalten möchten. Ohne sie haben Sie einfache ASCII mit 6 Bytes pro russischem Buchstaben im Gegensatz zu 2 Bytes pro Zeichen mit dieser Flagge.unicode()
Teil richtig . Ich habe gerade fürio
Paket in Python 2 realisiert,write()
brauchtunicode
, nichtstr
.Schreiben Sie Daten in eine Datei mit JSON. Verwenden Sie dazu json.dump () oder json.dumps () . Schreiben Sie so, um Daten in einer Datei zu speichern.
Dieses Beispiel in der Liste wird in einer Datei gespeichert.
quelle
Um den JSON mit Einrückung zu schreiben, "hübscher Druck":
Wenn Sie nicht ordnungsgemäß formatiertes JSON debuggen müssen und eine hilfreiche Fehlermeldung erhalten möchten, verwenden Sie
import simplejson
stattdessen die Bibliothek anstelle vonimport json
(Funktionen sollten identisch sein).quelle
quelle
f = open('1.txt', 'w'); f.write('a'); input()
. Führen Sie es aus und SYGTERMIEREN Sie es (Ctrl-Z
dannkill %1
unter Linux,Ctrl-Break
unter Windows).1.txt
wird 0 Bytes haben. Dies liegt daran, dass das Schreiben gepuffert wurde und die Datei zum Zeitpunkt des Auftretens von SYGTERM weder geleert noch geschlossen wurde.with
Der Block garantiert, dass die Datei immer geschlossen wird, genau wie der Block 'try / finally', jedoch kürzer.JSON in eine Datei schreiben
JSON aus einer Datei lesen
quelle
Wenn Sie versuchen, einen Pandas-Datenrahmen im JSON-Format in eine Datei zu schreiben, würde ich dies empfehlen
quelle
Alle vorherigen Antworten sind hier richtig. Dies ist ein sehr einfaches Beispiel:
quelle
Die akzeptierte Antwort ist in Ordnung. Allerdings bin ich dabei auf den Fehler "Ist nicht json serialisierbar" gestoßen.
So habe ich es
open("file-name.json", 'w')
als Ausgabe behoben :output.write(str(response))
Obwohl es keine gute Lösung ist, da die von ihr erstellte JSON-Datei keine doppelten Anführungszeichen enthält, ist es großartig, wenn Sie schnell und schmutzig suchen.
quelle
Die JSON-Daten können wie folgt in eine Datei geschrieben werden
In eine Datei schreiben:
quelle