Как написать словарь в существующий файл?
Скажем, у меня есть словарь, и я хочу записать его в существующий файл. Как я могу это сделать, не теряя ничего, что потенциально уже могло бы существовать в файле? То, о чем я думал, делает следующее:
def write_report(r, filename):
input_filename=open(filename, "a")
input_filename.close()
for (k,v) in r.items():
input_filename.write(k,v)
return filename
Я хочу убедиться, что имя файла правильно содержит словарь.
Ответы
Ответ 1
Вы можете использовать json
модуль для чтения и записи структур данных в формате JSON (другими словами, сериализуйтесь в JSON и десериализуйте JSON).
Например:
import json
# load from file:
with open('/path/to/my_file.json', 'r') as f:
try:
data = json.load(f)
# if the file is empty the ValueError will be thrown
except ValueError:
data = {}
# save to file:
with open('/path/to/my_file.json', 'w') as f:
data['new_key'] = [1, 2, 3]
json.dump(data, f)
Ответ 2
рассол может быть другим выбором:
import pickle
output = open('output.txt', 'ab+')
data = {'a': [1, 2, 3],}
pickle.dump(data, output)
output.close()
# read data
output = open('output.txt', 'rb')
obj_dict = pickle.load(output) # 'obj_dict' is a dict object
Но только данные, которые были сериализованы рассолом, можно было прочитать с помощью pickle.load. Поэтому, если вы хотите прочитать все данные из файла, вы должны pickle.dump все данные в файл.
Ответ 3
Если вы хотите добавить текстовое представление каждой пары ключ-значение в словаре в текстовый файл, вы можете изучить следующий подход:
def write_report(r, filename):
input_file=open(filename, "a")
for k, v in r.items():
line = '{}, {}'.format(k, v)
print(line, file=input_file)
input_file.close()
Вышеуказанное может быть выражено более чисто с помощью статута.
def write_report(r, filename):
with open(filename, "a") as input_file:
for k, v in r.items():
line = '{}, {}'.format(k, v)
print(line, file=input_file)
Ответ 4
То, что вы уже сделали с помощью open(filename, "a")
, использует режим присоединения - это почти все, что вам нужно. В режиме добавления вы никогда не будете перезаписывать то, что уже есть в файле. Проблема в том, что он не гарантирует, что вы единственный, кто пишет - и если какие-либо записи могут быть частичными, они могут выйти из строя, если в одном файле работают несколько авторов. Эту проблему можно избежать, используя блокировку файла.
В приведенном выше коде есть еще несколько проблем, например, закрытие файла перед его записью, а также тот факт, что запись принимает только один строковый аргумент. Вы захотите сериализовать данные в управляемые куски, для которых собственный стандартный модуль Python pickle (и shelve хранит вещи в файлах базы данных), а JSON - более широко поддерживаемый формат.