如何仅覆盖JSON文件中的特定键值对而非整个文件?
问题
我有一个myfile.txt文件,内容为Python风格的字典列表,如下所示:
[{"jp": "str1", "jp_ch": "str1_output"}, {"jp": "str2", "jp_ch": "str2_output"}]
我想要修改列表中字典内的特定值,例如将"jp_ch": "str1_output"修改为"jp_ch": "new_string"。
我当前的常规做法是:
- 打开
myfile.txt,使用json.loads()将内容加载为变量jsf; - 在
jsf中修改特定值; - 将
jsf重新写入,覆盖整个myfile.txt。
对应的代码如下:
import json def edit(to_correct, corrected): file_name = 'myfile.txt' f = open(file_name, 'r') jsf = json.loads(f.read()) for seg in jsf: for property in seg: if str(seg[property]) == to_correct: sure = input("Are you sure this is the correct one (* / n) : ") if sure != 'n': seg[property] = corrected return # 覆盖写入整个文件 with open(file_name, 'w') as f: json.dump(jsf, f, indent=2) to_correct = input("what is the one to-correct : ") corrected = input("what is the corrected answer for that : ") edit(to_correct, corrected)
我想请教:是否可以仅覆盖myfile.txt中的特定值,而非覆盖整个文件?例如直接将"jp_ch": "str1_output"替换为"jp_ch": "new_string",无需重写整个文件。
回答
不行,没法直接在文件里只覆盖特定值,核心原因有两个:
- 文本文件的存储逻辑:文本文件是字节流形式存储的,没有内置的"定位到某个键值对修改"的机制。如果新字符串和原字符串长度不同,修改后会打乱后续内容的结构;就算长度一致,你也得精准定位到该内容的字节位置——但JSON里的空格、换行符差异都会干扰定位,很容易把文件搞坏。
- JSON的结构化属性:JSON是严格的结构化数据,直接修改文本内容极易破坏语法(比如引号、逗号的位置),导致整个文件变成无效JSON。
如果觉得全量重写太笨重,可考虑两个优化方向:
- 改用行式JSON存储:把每个字典单独放在一行,比如:
这种格式下,你可以逐行读取找到目标行,修改后仅重写该行(或先把所有行读入内存,修改对应行后再写入),大文件场景下能节省内存开销。{"jp": "str1", "jp_ch": "str1_output"} {"jp": "str2", "jp_ch": "str2_output"} - 优化现有代码:原代码找到第一个匹配值就直接return,没法处理多个相同值的情况;另外建议用
with语句管理文件句柄,避免资源泄漏(示例代码里已经补上了这部分)。
内容的提问来源于stack exchange,提问作者jaklois
相关产品推荐
相关产品推荐

