我正在读取一个文件,其中每行都包含一个字典,但整个文件作为一个自身没有格式化为字典或列表。
{"key1":"value11", "key2":"value12"}
{"key1":"value21", "key2":"value22"}
我想做的是读取文件并更改某些键的值。 像这样的东西。
with open(...
data = reader.read().split("\n")
for dic in data:
entry = json.loads(dic)
entry["key"] = "another value"
我知道如果我想将其保存到文件中,我必须再次打开该文件,但它在内存中甚至没有改变,我猜测这与数据中的for i有关
有效,但我不想从每个文件中进行复制,主要是因为我有很多行。
还有其他我没有看到的方法吗?
最佳答案
为了提高效率,我建议将您的数据转换为 dict
的单个字典。对象。您可以使用行号进行索引。
首先将数据读入单个字典:
from io import StringIO
import json, pickle
x = StringIO('''{"key1":"value11", "key2":"value12"}
{"key1":"value21", "key2":"value22"}''')
d = {}
# replace x with open('file.txt', 'r')
with x as fin:
for idx, line in enumerate(fin):
d[idx] = json.loads(line.strip())
print(d)
# {0: {'key1': 'value11', 'key2': 'value12'},
# 1: {'key1': 'value21', 'key2': 'value22'}}
然后将其写入Pickle文件,注意pickle.HIGHEST_PROTOCOL
代表一种高效的二进制格式:
filename = r'C:\temp\out.pkl'
# never work with the old format again!
with open(filename, 'wb') as fout:
pickle.dump(d, fout, pickle.HIGHEST_PROTOCOL)
然后再次读取文件:
with open(filename, 'rb') as fin:
d_in = pickle.load(fin)
print(d_in)
# {0: {'key1': 'value11', 'key2': 'value12'},
# 1: {'key1': 'value21', 'key2': 'value22'}}
更改子词典现在就像 d[1]['key1'] = 'newval'
一样简单.
请注意,酸洗/序列化是特定于版本的。但是,通过这种一次性数据重组,您应该会看到性能的大幅提升。
关于Python修改字典列表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51891858/