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

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

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)

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

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

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

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 ]

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.


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


-2
import json

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

Você pode melhorar esse erro adicionando uma explicação de por que ele funciona.
Greg o Incrédulo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.