Запись словаря в текстовый файл?

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

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.


person Nic    schedule 01.05.2016    source источник


Ответы (9)


Прежде всего, вы открываете файл в режиме чтения и пытаетесь в него записать. Проконсультируйтесь - режимы ввода-вывода 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 импорт пакета pickle будет другим

import _pickle as pickle
person hspandher    schedule 01.05.2016
comment
Это сработало! Хотя он записывает только содержимое словаря. Можете ли вы заставить его написать: exDict = {111:111, 222:222} - person Nic; 01.05.2016
comment
Я думал об этом, но думал, что есть лучший способ. Хотя работает, так что спасибо! - person Nic; 01.05.2016
comment
Если вы не слишком привязаны к знаку =, сделанное мной редактирование может сработать. - person hspandher; 01.05.2016
comment
То, как вы это делали раньше: file.write('exDict = ' + json.dumps(exDict)) отлично работало для меня, поскольку я использую его прямо сейчас. - person Nic; 01.05.2016
comment
@hspandher Как вы читаете file.write(json.dumps(exDict))? json.load(file) не работает с этим. - person quil; 06.08.2017
comment
@verity Попробуйте json.loads вместо json.load. - person hspandher; 06.08.2017
comment
Почему вы используете json.dumps(exDict) вместо, казалось бы, более простого str(exDict)? - person Jan Kukacka; 19.01.2018
comment
@JanKukacka JSON — это стандартный формат данных. То, что выдаст str(exDict), не всегда будет действительным JSON. Одна из причин, которая мне пришла в голову, заключается в том, что одинарные кавычки недействительны в файле JSON, хотя могут присутствовать, когда мы используем метод str. - person hspandher; 19.01.2018
comment
@hspandher Я согласен, что JSON имеет преимущества, когда дело доходит до дальнейшей машинной обработки содержимого словаря (а затем мариновать звук даже лучше, чем JSON), но OP только спросил, как распечатать его в текстовый файл. Также обратите внимание, что сериализация JSON имеет некоторые неожиданные проблемы с десятичными знаками: "> stackoverflow.com/questions/1960516/ - person Jan Kukacka; 19.01.2018
comment
Python 3 требует явного двоичного вывода с помощью pickle (with open('file.txt', 'wb') as file:) - person Moilleadóir; 03.10.2020
comment
почему бы не использовать json.dump(exDict, file) вместо dumps? - person baxx; 07.01.2021
comment
при травлении в файл можно сделать это напрямую with open('fname.pickle', 'wb') as file: pickle.dump(exDict, file) нет необходимости в file.write() что на самом деле дает вам ошибку. - person Daniel Kislyuk; 22.01.2021

Я делаю это так в python 3:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)
person NKSHELL    schedule 20.11.2018
comment
Мне нравится этот, потому что нет необходимости в импорте. Ответ выше data.write(str(dictionary)) не будет работать с правильным словарем, так как он просто напишет ‹class 'dict'› в вашем файле - person Si Mon; 11.12.2018
comment
Мне также любопытно, почему бы просто не выполнить print(mydictionary, file=open('myfile.txt', 'w')) - person MadmanLee; 06.05.2019
comment
@MadmanLee Я думаю, что и то, и другое в порядке, и это вопрос того, как мы предпочитаем, чтобы наш код выглядел. - person NKSHELL; 07.05.2019
comment
с open('myfile.txt', 'r') как f: content = f.read(); dic = оценка (содержание); - person NKSHELL; 02.09.2019
comment
Причина, по которой json лучше, чем просто запись str(mydict) в файл, заключается именно в том, что вам не нужно eval содержимое, чтобы вернуть объект dict. eval — это риск безопасности, и его не следует использовать, если доступны лучшие варианты. - person snakecharmerb; 30.04.2020
comment
@snakecharmerb Я думаю, что в этом конкретном случае eval безопасен. И даже если это не так, python является универсальным, и безопасность не касается, например. в исследовательском программировании. - person NKSHELL; 04.05.2020
comment
@MadmanLee, вам следует использовать оператор with, потому что вы закрываете файл. Вы бы не закрыли файл в своем примере. - person Chris Fowl; 15.06.2020
comment
лучшее простое решение спасибо - person Ahmad Asmndr; 03.03.2021

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

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))
person clyde_the_frog    schedule 18.05.2018
comment
это правильный ответ, так как в коде вопроса есть ошибка. - person Ricardo Rivaldo; 29.11.2018
comment
Когда я пробую маршрут json, я получаю ошибку, потому что у меня есть некоторые значения NaN в числах с плавающей запятой. Нет исправления без повреждения самих данных, если вы хотите написать JSON. Следовательно, этот ответ является предпочтительным, поскольку он может сохранить текстовый файл, чтобы точно отразить диктовку. - person pauljohn32; 29.05.2020

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

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
person MarMat    schedule 11.09.2018
comment
Это работает только для строк, а не для других типов в словаре. - person Paul Kenjora; 02.12.2019

Для любителей понимания списков это запишет все пары 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 ]
person DavideL    schedule 30.04.2020

Я знаю, что это старый вопрос, но я также подумал поделиться решением, которое не включает 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')

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

person Angelo    schedule 14.08.2018
comment
зачем использовать внешнюю библиотеку для простой задачи? Python Simple - лучший принцип. - person Ricardo Rivaldo; 29.11.2018
comment
Не очень полезно, потому что большинство словарей, которые я использую, недостаточно просты, чтобы стать полезными объектами DataFrame. - person pauljohn32; 29.05.2020

Вы можете сделать следующее:

import json
exDict = {1:1, 2:2, 3:3}
file.write(json.dumps(exDict))

https://developer.rhino3d.com/guides/rhinopython/python-xml-json/

person Shivam Verma    schedule 02.09.2018

person    schedule
comment
Ответы, содержащие только код, не рекомендуются, поскольку они не объясняют, как они решают проблему. Пожалуйста, обновите свой ответ, чтобы объяснить, как это улучшает другие принятые и одобренные ответы, которые уже есть на этот вопрос. Просмотрите Как написать хороший ответ. - person FluffyKitten; 10.09.2017
comment
Кроме того, вы должны использовать оператор with при чтении и записи файлов: заголовок stackoverflow.com/questions/3012488/ - person Falko; 15.01.2018

person    schedule
comment
Вы можете исправить эту ошибку, добавив объяснение, почему она работает. - person Greg the Incredulous; 09.05.2019