Escrevendo um dicionário em um arquivo de texto?

86

Tenho um dicionário e estou tentando escrevê-lo em um arquivo.

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

Então eu tenho o erro

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

Corrigi esse erro, mas veio outro erro

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

O erro:

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

Não tenho ideia do que fazer, pois ainda sou um iniciante em python. Se alguém souber como resolver o problema, forneça uma resposta.

NOTA: Estou usando o python 3, não o python 2

Nic
fonte

Respostas:

142

Em primeiro lugar, você está abrindo o arquivo no modo de leitura e tentando escrever nele. Consultar - modos IO python

Em segundo lugar, você só pode escrever uma string em um arquivo. Se você quiser escrever um objeto de dicionário, precisará convertê-lo em string ou serializá-lo.

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

Em caso de serialização

import cPickle as pickle

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

Para o python 3.x, a importação do pacote pickle seria diferente

import _pickle as pickle
Hspandher
fonte
1
Isso funcionou! Embora, ele apenas escreva o conteúdo do dicionário. Você pode fazer com que escreva: exDict = {111: 111, 222: 222}
Nic
Pensei nisso, mas pensei que havia uma maneira melhor. Funciona, então, obrigado!
Nic
Se você não estiver muito apegado ao =sinal, a edição que fiz pode dar conta do recado.
hspandher
Do jeito que você tinha antes: file.write ('exDict =' + json.dumps (exDict)) funcionou bem para mim, pois estou usando agora.
Nic
1
@JanKukacka JSON é um formato de dados padrão. O str(exDict)que produziria nem sempre será um JSON válido. Pensando bem, um motivo é que as aspas simples não são válidas em um arquivo JSON, embora possam estar presentes quando usamos o strmétodo.
hspandher
49

Eu faço assim no python 3:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)
NKSHELL
fonte
1
Eu gosto deste porque não há necessidade de importação. A resposta acima data.write (str (dicionário)) não funcionará com um dicionário correto, pois apenas escreverá <class 'dict'> em seu arquivo
Si Mon
Uma coisa que também estou curioso é por que não apenas imprimir (mydictionary, file = open ('myfile.txt', 'w'))
MadmanLee
@MadmanLee Acho que os dois estão OK, e é uma questão de como preferimos a aparência do nosso código.
NKSHELL
1
com open ('myfile.txt', 'r') como f: content = f.read (); dic = eval (conteúdo);
NKSHELL
A razão pela qual json é melhor do que apenas gravar str(mydict)em um arquivo é precisamente porque você não precisa evaldo conteúdo para obter o dictobjeto de volta. evalé uma lista de segurança e não deve ser usada se houver opções melhores disponíveis.
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
fonte
12
Respostas apenas em código são desencorajadas porque não explicam como resolvem o problema. Atualize sua resposta para explicar como isso melhora as outras respostas aceitas e votadas nesta pergunta já. Reveja Como escrevo uma boa resposta .
FluffyKitten
Além disso, você deve usar a withinstrução ao ler e gravar em arquivos: stackoverflow.com/questions/3012488/…
Falko
13

O problema com o seu primeiro bloco de código era que você estava abrindo o arquivo como 'r', embora quisesse escrever nele usando 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))
clyde_the_frog
fonte
essa é a resposta correta, pois o código da pergunta contém um erro.
Ricardo Rivaldo
Quando tento a rota json, recebo uma falha porque tenho alguns valores "NaN" em floats. Não há conserto sem danificar os próprios dados se você quiser gravar JSON. Portanto, essa resposta é a preferida porque pode salvar um arquivo de texto para refletir com precisão o dicionário.
pauljohn32
7

Se você quiser um dicionário, pode importar de um arquivo por nome e também adicionar entradas bem classificadas e conter strings que deseja preservar, você pode tentar isto:

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

Em seguida, para importar:

from file import dictionary_name
MarMat
fonte
Isso só funciona para strings, não para outros tipos de dicionário.
Paul Kenjora
4

Para os amantes da compreensão de listas, isso escreverá todos os key : valuepares em novas linhas emdog.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
fonte
1

Sei que essa é uma questão antiga, mas também pensei em compartilhar uma solução que não envolvesse JSON. Eu pessoalmente não gosto de json porque ele não permite anexar dados facilmente. Se o seu ponto de partida for um dicionário, você pode primeiro convertê-lo em um dataframe e depois anexá-lo ao seu arquivo 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')

Espero que isso possa ajudar.

Angelo
fonte
1
por que usar uma biblioteca externa para uma tarefa simples? Python simples é o melhor princípio.
Ricardo Rivaldo
Não é muito útil porque a maioria dos dicionários que uso não são simples o suficiente para se tornarem objetos DataFrame úteis.
pauljohn32
1
exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'w+') as file:
    file.write(str(exDict))
ianzo
fonte
-2
import json

with open('tokenler.json', 'w') as file:
     file.write(json.dumps(mydict, ensure_ascii=False))
malibayram91
fonte
Você pode melhorar esse erro adicionando uma explicação de por que ele funciona.
Greg o Incrédulo