假设我有一本字典,我想将其写入现有文件。如何在不丢失文件中可能存在的任何内容的情况下这样做?我在想的是做了以下事情:
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
我想确定的是文件名正确包含字典。
答案 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是更广泛支持的格式。