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

14

假设我有一个字典,并且我想将它写入到一个已经存在的文件中。我该如何做到不会丢失文件中可能已经存在的任何内容呢?我的想法是执行以下操作:

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

我想要确保的是文件名中正确地包含了字典。


将同一个字典存在于文件中,还是将其附加到已经有其他内容的文件中? - Kyle Kelley
4个回答

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)

可能需要一些同步来确保线程安全 :) - CodeReaper
1
当然,但同步是另一个问题。 :) - Eugene Naydenov
2
自然地,我只是想让原帖作者意识到这个问题 ;) - CodeReaper

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到文件中。


1
该问题标记为python-3.3,其中import cPickle是一个ImportError(只要可用,import pickle会自动使用加速版本)。 - lvc

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语句更加简洁地表达。
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)

0

你已经使用open(filename, "a")完成了几乎所有需要的附加模式操作。在附加模式下,你永远不会覆盖文件中已有的内容。问题是它不能保证你是唯一的写入者,如果有任何写入可能是部分的,那么如果有多个写入者在同一个文件上工作,它们可能会出现混乱。这种问题可以通过文件锁定来避免。

你发布的代码还有一些问题,例如在写入之前关闭文件,以及write只接受一个字符串参数。你需要将数据序列化为可管理的块,Python自带的标准模块pickleshelve将东西存储在数据库文件中)可以实现此功能,而JSON是更广泛支持的格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接