Писать словарь в текстовый файл?

87

У меня есть словарь, и я пытаюсь записать его в файл.

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

Тогда у меня ошибка

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

Я исправил эту ошибку, но пришла другая ошибка

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

Ошибка:

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

Я понятия не имею, что делать, поскольку я все еще новичок в Python. Если кто знает, как решить проблему, дайте ответ.

ПРИМЕЧАНИЕ: я использую python 3, а не python 2

Ник
источник

Ответы:

144

Прежде всего, вы открываете файл в режиме чтения и пытаетесь в него записать. Консультации - режимы ввода-вывода python

Во-вторых, вы можете записать в файл только строку. Если вы хотите написать объект словаря, вам нужно либо преобразовать его в строку, либо сериализовать.

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

В случае сериализации

import cPickle as pickle

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

Для python 3.x импорт пакета рассола будет другим

import _pickle as pickle
hspandher
источник
1
Это сработало! Хотя записывает только содержание словаря. Сможете ли вы заставить его написать: exDict = {111: 111, 222: 222}
Ник,
Я подумал об этом, но подумал, что есть способ получше. Это работает, так что спасибо!
Ник
Если вы не слишком привязаны к =знаку, то внесенное мной правка может сработать.
hspandher 01
То, как вы это делали раньше: file.write ('exDict =' + json.dumps (exDict)) отлично сработало для меня, поскольку я использую его прямо сейчас.
Nic
1
@JanKukacka JSON - это стандартный формат данных. Что str(exDict)бы производить не всегда будет действительным в формате JSON. Одна из причин, по которой я задумывался, заключается в том, что одинарные кавычки недопустимы в файле JSON, хотя могут присутствовать, когда мы используем strметод.
hspandher
49

В Python 3 я делаю так:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)
NKSHELL
источник
1
Мне нравится этот, потому что импорт не требуется. Ответ выше data.write (str (dictionary)) не будет работать с правильным словарем, поскольку он просто напишет <class 'dict'> в вашем файле
Si Mon
Мне также любопытно, почему бы просто не напечатать (mydictionary, file = open ('myfile.txt', 'w'))
MadmanLee
@MadmanLee Я думаю, что и то, и другое в порядке, и дело в том, как мы предпочитаем, чтобы наш код выглядел.
NKSHELL
1
с open ('myfile.txt', 'r') как f: content = f.read (); dic = eval (контент);
NKSHELL
Причина, по которой json лучше, чем просто запись str(mydict)в файл, состоит как раз в том, что вам не нужно evalсодержимое, чтобы вернуть dictобъект. evalявляется угрозой безопасности и не должен использоваться, если доступны лучшие варианты.
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
Ответы только на код не приветствуются, потому что они не объясняют, как они решают проблему. Обновите свой ответ, чтобы объяснить, как он улучшает другие принятые и получившие одобрение ответы на этот вопрос. Пожалуйста, просмотрите Как мне написать хороший ответ .
FluffyKitten
Кроме того, вы должны использовать этот withоператор при чтении и записи в файлы: stackoverflow.com/questions/3012488/…
Falko
13

Проблема с вашим первым блоком кода заключалась в том, что вы открывали файл как 'r', даже если вы хотели записать в него, используя 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))
clyde_the_frog
источник
это правильный ответ, поскольку код в вопросе содержит ошибку.
Рикардо Ривалдо
Когда я пробую использовать путь json, я получаю ошибку, потому что у меня есть некоторые значения NaN в числах с плавающей запятой. Если вы хотите писать JSON, нет исправления, не повредившего сами данные. Следовательно, этот ответ является предпочтительным, потому что он может сохранить текстовый файл, чтобы точно отразить dict.
pauljohn32
7

Если вам нужен словарь, который вы можете импортировать из файла по имени, а также добавляющие записи, которые хорошо отсортированы и содержат строки, которые вы хотите сохранить, вы можете попробовать следующее:

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

Затем импортировать:

from file import dictionary_name
МарМат
источник
Это работает только для строк, а не для других типов в словаре.
Пол Кенджора
4

Для любителей понимания списков все key : valueпары будут записаны в новых строках вdog.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
источник
1

Я знаю, что это старый вопрос, но я также подумал поделиться решением, которое не связано с json. Мне лично не нравится json, потому что он не позволяет легко добавлять данные. Если вашей отправной точкой является словарь, вы можете сначала преобразовать его в фрейм данных, а затем добавить в свой текстовый файл:

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

Надеюсь, это поможет.

Анджело
источник
1
зачем использовать внешнюю библиотеку для простой задачи? Python Simple - лучший принцип.
Рикардо Ривалдо
Не очень полезно, потому что большинство словарей, которые я использую, недостаточно просты, чтобы стать полезными объектами 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))
малибайрам91
источник
Вы можете исправить эту ошибку, добавив объяснение, почему она работает.
Грег Невероятный