Ein Wörterbuch in eine Textdatei schreiben?

86

Ich habe ein Wörterbuch und versuche es in eine Datei zu schreiben.

exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'r') as file:
    file.write(exDict)

Ich habe dann den Fehler

file.write(exDict)
TypeError: must be str, not dict

Also habe ich diesen Fehler behoben, aber es kam ein weiterer Fehler

exDict = {111:111, 222:222}
with open('file.txt', 'r') as file:
    file.write(str(exDict))

Der Fehler:

file.write(str(exDict))
io.UnsupportedOperation: not writable

Ich habe keine Ahnung, was ich tun soll, da ich noch ein Anfänger in Python bin. Wenn jemand weiß, wie das Problem behoben werden kann, geben Sie bitte eine Antwort.

HINWEIS: Ich verwende Python 3, nicht Python 2

Nic
quelle

Antworten:

142

Zunächst öffnen Sie die Datei im Lesemodus und versuchen, in sie zu schreiben. Consult - IO-Modi Python

Zweitens können Sie nur eine Zeichenfolge in eine Datei schreiben. Wenn Sie ein Wörterbuchobjekt schreiben möchten, müssen Sie es entweder in eine Zeichenfolge konvertieren oder serialisieren.

import json

# as requested in comment
exDict = {'exDict': exDict}

with open('file.txt', 'w') as file:
     file.write(json.dumps(exDict)) # use `json.loads` to do the reverse

Im Falle einer Serialisierung

import cPickle as pickle

with open('file.txt', 'w') as file:
     file.write(pickle.dumps(exDict)) # use `pickle.loads` to do the reverse

Für Python 3.x wäre der Import von Pickle-Paketen anders

import _pickle as pickle
hspandher
quelle
1
Das hat funktioniert! Es wird jedoch nur der Inhalt des Wörterbuchs geschrieben. Können Sie es zum Schreiben bringen: exDict = {111: 111, 222: 222}
Nic
Ich dachte daran, dachte aber, es gäbe einen besseren Weg. Es funktioniert aber so danke!
Nic
Wenn Sie nicht zu sehr mit =Zeichen verbunden sind, kann die von mir vorgenommene Bearbeitung den Job erledigen.
hspandher
Die Art und Weise, wie Sie es vorher hatten: file.write ('exDict =' + json.dumps (exDict)) hat für mich gut funktioniert, da ich es gerade benutze.
Nic
1
@ JanKukacka JSON ist ein Standarddatenformat. Was str(exDict)produzieren würde, wird nicht immer ein gültiger JSON sein. Ein Grund aus meinem Hinterkopf ist, dass einfache Anführungszeichen in einer JSON-Datei nicht gültig sind, während sie möglicherweise vorhanden sind, wenn wir die strMethode verwenden.
Hspandher
48

Ich mache es so in Python 3:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)
NKSHELL
quelle
1
Ich mag dieses, weil kein Import notwendig ist. Die Antwort weiter oben auf data.write (str (Wörterbuch)) funktioniert nicht mit einem korrekten Wörterbuch, da nur <class 'dict'> in Ihre Datei geschrieben wird
Si Mon
Eine Sache, auf die ich auch neugierig bin, ist, warum nicht einfach drucken (mydictionary, file = open ('myfile.txt', 'w'))
MadmanLee
@ MadmanLee Ich denke, beide sind in Ordnung und es kommt darauf an, wie wir unseren Code bevorzugen.
NKSHELL
1
mit open ('myfile.txt', 'r') als f: content = f.read (); dic = eval (Inhalt);
NKSHELL
Der Grund, warum json besser ist als nur str(mydict)in eine Datei zu schreiben , ist genau, dass Sie evalden Inhalt nicht benötigen , um das dictObjekt zurückzubekommen. evalist ein Sicherheits-Rosk und sollte nicht verwendet werden, wenn bessere Optionen verfügbar sind.
Snakecharmerb
22
fout = "/your/outfile/here.txt"
fo = open(fout, "w")

for k, v in yourDictionary.items():
    fo.write(str(k) + ' >>> '+ str(v) + '\n\n')

fo.close()
Sange Negru
quelle
12
Von Nur-Code-Antworten wird abgeraten, da sie nicht erklären, wie sie das Problem lösen. Bitte aktualisieren Sie Ihre Antwort, um zu erklären, wie sich dies gegenüber den anderen akzeptierten und positiv bewerteten Antworten verbessert, die diese Frage bereits hat. Bitte überprüfen Sie, wie ich eine gute Antwort schreibe .
FluffyKitten
Sie sollten die withAnweisung auch beim Lesen und Schreiben von Dateien verwenden: stackoverflow.com/questions/3012488/…
Falko
13

Das Problem mit Ihrem ersten Codeblock war, dass Sie die Datei als 'r' geöffnet haben, obwohl Sie mit schreiben wollten 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))
clyde_the_frog
quelle
Dies ist die richtige Antwort, da der Code in der Frage einen Fehler aufweist.
Ricardo Rivaldo
Wenn ich die JSON-Route versuche, wird ein Fehler angezeigt, da ich einige "NaN" -Werte in Floats habe. Es gibt keine Lösung, ohne die Daten selbst zu beschädigen, wenn Sie JSON schreiben möchten. Daher ist diese Antwort die bevorzugte, da sie eine Textdatei speichern kann, um das Diktat genau wiederzugeben.
Pauljohn32
7

Wenn Sie ein Wörterbuch möchten, das Sie nach Namen aus einer Datei importieren können, und das Einträge hinzufügt, die gut sortiert sind und Zeichenfolgen enthalten, die Sie beibehalten möchten, können Sie Folgendes versuchen:

data = {'A': 'a', 'B': 'b', }

with open('file.py','w') as file:
    file.write("dictionary_name = { \n")
    for k in sorted (data.keys()):
        file.write("'%s':'%s', \n" % (k, data[k]))
    file.write("}")

Dann zum Importieren:

from file import dictionary_name
MarMat
quelle
Dies funktioniert nur für Zeichenfolgen, nicht für andere Typen in einem Wörterbuch.
Paul Kenjora
4

Für Liebhaber des Listenverständnisses werden dadurch alle key : valuePaare in neuen Zeilen geschriebendog.txt

my_dict = {'foo': [1,2], 'bar':[3,4]}

# create list of strings
list_of_strings = [ f'{key} : {my_dict[key]}' for key in my_dict ]

# write string one by one adding newline
with open('dog.txt', 'w') as my_file:
    [ my_file.write(f'{st}\n') for st in list_of_strings ]
DavideL
quelle
1

Ich weiß, dass dies eine alte Frage ist, aber ich dachte auch, eine Lösung zu teilen, die nicht json beinhaltet. Ich persönlich mag json nicht ganz, weil es nicht einfach ist, Daten anzuhängen. Wenn Ihr Ausgangspunkt ein Wörterbuch ist, können Sie es zuerst in einen Datenrahmen konvertieren und dann an Ihre txt-Datei anhängen:

import pandas as pd
one_line_dict = exDict = {1:1, 2:2, 3:3}
df = pd.DataFrame.from_dict([one_line_dict])
df.to_csv('file.txt', header=False, index=True, mode='a')

Ich hoffe das konnte helfen.

Angelo
quelle
1
Warum eine externe Bibliothek für eine einfache Aufgabe verwenden? Python Simple ist ein besseres Prinzip.
Ricardo Rivaldo
Nicht sehr nützlich, da die meisten von mir verwendeten Wörterbücher nicht einfach genug sind, um nützliche DataFrame-Objekte zu werden.
Pauljohn32
1
exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'w+') as file:
    file.write(str(exDict))
ianzo
quelle
-2
import json

with open('tokenler.json', 'w') as file:
     file.write(json.dumps(mydict, ensure_ascii=False))
malibayram91
quelle
Sie können diesen Fehler verbessern, indem Sie eine Erklärung hinzufügen, warum er funktioniert.
Greg der Unglaubliche