Python修改字典列表中的值

标签 python json dictionary

我正在读取一个文件,其中每行都包含一个字典,但整个文件作为一个自身没有格式化为字典或列表。

{"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/

相关文章:

python - 我如何使用二进制列表在 PyGame 中绘制正方形?

python - Sphinx 和可重复使用的 Django 应用程序

json - Grails:将非域类转换为JSON

ASP.NET MVC3 Ajax 错误响应与 HTTP 4XX

用于对 ls -l 输出中的值求和的 Python 脚本

python - 是否可以将 docopt --help 选项重定向到 less ?

Python 未实现错误 : pool objects cannot be passed between processes

python - 对满足嵌套键中的条件的字典的所有值进行操作

java - 如何将JSON数据存储在Arraylist中?

dictionary - 免费提供中文、日文、中日韩字符字典数据