如何将字典写入现有文件?

时间:2013-11-24 00:02:46

标签: python dictionary python-3.3

假设我有一本字典,我想将其写入现有文件。如何在不丢失文件中可能存在的任何内容的情况下这样做?我在想的是做了以下事情:

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

我想确定的是文件名正确包含字典。

4 个答案:

答案 0 :(得分:25)

您可以使用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)

答案 1 :(得分:7)

pickle 可能是另一种选择:

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 序列化的数据才能使用 pickle.load 读取。因此,如果您想要读取文件中的所有数据,您应该 pickle.dump 将所有数据放入文件中。

答案 2 :(得分:2)

如果要将字典中每个键值对的文本表示附加到文本文件中,可以查看以下方法:

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

上述内容可以用with with statment更清晰地表达。

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)

答案 3 :(得分:0)

您使用open(filename, "a")已经完成的操作使用附加模式 - 这几乎就是您所需要的。在追加模式下,您永远不会覆盖文件中已有的内容。问题是它不能保证你是唯一一个写入 - 如果任何写入可能是部分的,如果有多个编写器在同一个文件上工作,它们可能会出现乱码。使用file locking可以避免这类问题。

您发布的代码还有一些问题,例如在写入文件之前关闭文件,以及write只接受一个字符串参数这一事实。您需要将数据序列化为可管理的块,Python自己的标准模块为pickle(并且shelve存储数据库文件中的内容),而JSON是更广泛支持的格式。