Как написать словарь в существующий файл?

Скажем, у меня есть словарь, и я хочу записать его в существующий файл. Как я могу это сделать, не теряя ничего, что потенциально уже могло бы существовать в файле? То, о чем я думал, делает следующее:

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 pickleshelve хранит вещи в файлах базы данных), а JSON - более широко поддерживаемый формат.