Scrivi un dizionario in un file di testo?


96

Ho un dizionario e sto cercando di scriverlo su un file.

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

Allora ho l'errore

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

Quindi ho corretto quell'errore ma è arrivato un altro errore

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

L'errore:

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

Non ho idea di cosa fare dato che sono ancora un principiante in Python. Se qualcuno sa come risolvere il problema, fornisci una risposta.

NOTA: sto usando python 3, non python 2

Risposte:


154

Prima di tutto stai aprendo il file in modalità di lettura e provando a scrivere in esso. Consult - Modalità IO python

In secondo luogo, puoi solo scrivere una stringa in un file. Se vuoi scrivere un oggetto dizionario, devi convertirlo in stringa o serializzarlo.

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

In caso di serializzazione

import cPickle as pickle

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

Per python 3.x l'importazione del pacchetto pickle sarebbe diversa

import _pickle as pickle

1
Ha funzionato! Anche se scrive solo il contenuto del dizionario. Puoi convincerlo a scrivere: exDict = {111: 111, 222: 222}
Nic

Ci ho pensato, ma ho pensato che ci fosse un modo migliore. Funziona, quindi grazie!
Nic

Se non sei troppo attaccato al =segno, la modifica che ho fatto potrebbe fare il lavoro.
hspandher

Il modo in cui l'avevi prima: file.write ('exDict =' + json.dumps (exDict)) ha funzionato bene per me dato che lo sto usando in questo momento.
Nic

1
@JanKukacka JSON è un formato dati standard. Ciò str(exDict)che produrrebbe non sarà sempre un JSON valido. Uno dei motivi dietro alla mia testa è che le virgolette singole non sono valide in un file JSON, mentre potrebbero essere presenti quando usiamo il strmetodo.
hspandher

50

Lo faccio in questo modo in Python 3:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)

1
Mi piace perché non è necessaria l'importazione. La risposta sopra data.write (str (dizionario)) non funzionerà con un dizionario corretto in quanto scriverà solo <class 'dict'> nel tuo file
Si Mon

Una cosa che sono anche curiosa è perché non si limita a stampare (mydictionary, file = open ('myfile.txt', 'w'))
MadmanLee

@ MadmanLee Penso che entrambi siano OK, ed è una questione di come preferiamo il nostro codice.
NKSHELL

1
con open ('myfile.txt', 'r') come f: content = f.read (); dic = eval (contenuto);
NKSHELL

Il motivo per cui json è migliore della semplice scrittura str(mydict)su un file è precisamente che non è necessario evalil contenuto per recuperare l' dictoggetto. evalè un elenco di sicurezza e non dovrebbe essere usato se sono disponibili opzioni migliori.
snakecharmerb

23
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()

12
Le risposte di solo codice sono scoraggiate perché non spiegano come risolvono il problema. Aggiorna la tua risposta per spiegare come questo migliora rispetto alle altre risposte accettate e votate positivamente che questa domanda ha già. Si prega di rivedere Come scrivo una buona risposta .
FluffyKitten

Inoltre, dovresti usare l' withistruzione durante la lettura e la scrittura su file: stackoverflow.com/questions/3012488/…
Falko

13

Il problema con il tuo primo blocco di codice era che stavi aprendo il file come "r" anche se volevi scriverci usando 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))

questa è la risposta corretta, poiché il codice all'interno della domanda contiene un errore.
Ricardo Rivaldo

Quando provo il percorso json, ottengo un errore perché ho alcuni valori "NaN" in float. Non c'è soluzione senza danneggiare i dati stessi se vuoi scrivere JSON. Quindi, questa risposta è quella preferita perché può salvare un file di testo per riflettere accuratamente il dict.
pauljohn32

7

Se vuoi un dizionario che puoi importare da un file per nome, e anche che aggiunge voci che sono ben ordinate e contiene stringhe che vuoi conservare, puoi provare questo:

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("}")

Quindi per importare:

from file import dictionary_name

Funziona solo per le stringhe, non per altri tipi in un dizionario.
Paul Kenjora

4

Per gli amanti della comprensione delle liste, questo scriverà tutte le key : valuecoppie in nuove righe indog.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 ]

1

So che questa è una vecchia domanda, ma ho anche pensato di condividere una soluzione che non coinvolga JSON. Personalmente non mi piace molto json perché non consente di aggiungere facilmente dati. Se il tuo punto di partenza è un dizionario, puoi prima convertirlo in un dataframe e poi aggiungerlo al tuo file txt:

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')

Spero che questo possa aiutare.


1
perché utilizzare una libreria esterna per un'attività semplice? Python Simple è un principio migliore.
Ricardo Rivaldo

Non molto utile perché la maggior parte dei dizionari che uso non sono abbastanza semplici da diventare utili oggetti DataFrame.
pauljohn32

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


-2
import json

with open('tokenler.json', 'w') as file:
     file.write(json.dumps(mydict, ensure_ascii=False))

È possibile migliorare questo errore aggiungendo una spiegazione del motivo per cui funziona.
Greg the Incredulous
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.