Python如何将修改后的JSON数据写入文件顶部(seek(0)无效)
JSON写入时内容追加到文件底部、seek(0)无效的解决方法
问题复现代码
import json f = open("C:\last_esri.json", "r") data = json.load(f) f.close() for i in(data['fields']): for item in i: if i[item] == 'esriFieldTypeOID': i.update({'type' :'oid'}) elif i[item] == 'esriFieldTypeString': i.update({'type' :'string'}) elif i[item] == 'esriFieldTypeInteger': i.update({'type' :'integer'}) elif i[item] == 'esriFieldTypeDouble': i.update({'type' :'double'}) elif i[item] == 'esriFieldTypeDate': i.update({'type' :'date'}) f = open("C:\data\last_esri.json", 'w+') f.seek(0) f.write(json.dumps(data, indent=1)) f.close()
问题原因
- 路径存在两处错误:
- 读写路径不一致:读取的是C盘根目录的
last_esri.json,写入的是C盘data文件夹下的last_esri.json,如果之前调试时用追加模式往data目录下的文件写过内容,很容易出现内容堆叠。 - Windows路径未做转义处理:Python字符串中
\是转义字符,直接写"C:\data\last_esri.json"这类路径会被解析为错误地址,触发意料之外的文件写入行为。
- 读写路径不一致:读取的是C盘根目录的
- 对文件打开模式的逻辑理解有误:
w/w+模式打开文件的瞬间,就会自动把原文件截断为空,根本不需要手动调用seek(0)移动指针。- 如果用
r+模式(可读可写、不自动清空原文件),仅调用seek(0)从文件开头写内容,只要新内容长度比原文件短,原文件尾部的旧内容就会残留,看起来和追加效果一致。
- 原代码未显式指定文件编码,Windows系统默认用GBK编码打开文件,很容易出现JSON写入乱码、内容异常的问题。
修复方案
- 统一读写路径,Windows路径用以下任意一种写法规避转义问题:
- 加
r前缀声明为原始字符串:r"C:\last_esri.json" - 用正斜杠替代反斜杠:
"C:/last_esri.json" - 双写反斜杠做转义:
"C:\\last_esri.json"
- 加
- 纯写入场景直接用
w模式即可,不需要用w+(w+额外带读权限,该场景用不上),w模式打开时自动清空原文件,无需手动调用seek(0)。 - 如果必须用
r+模式读写同个文件,seek(0)写完内容后必须调用f.truncate(),截断删除文件指针之后的所有残留旧内容。 - 打开文件时显式指定
encoding="utf-8",避免编码问题导致的写入异常。 - 推荐用
with上下文管理器操作文件,自动处理文件关闭逻辑,避免句柄残留导致的写入失败。
修复后完整代码
import json # 统一文件路径,用原始字符串规避转义问题 file_path = r"C:\last_esri.json" # 读取原JSON数据 with open(file_path, "r", encoding="utf-8") as f: data = json.load(f) # 批量替换字段类型 for field in data["fields"]: for k, v in field.items(): if v == "esriFieldTypeOID": field["type"] = "oid" elif v == "esriFieldTypeString": field["type"] = "string" elif v == "esriFieldTypeInteger": field["type"] = "integer" elif v == "esriFieldTypeDouble": field["type"] = "double" elif v == "esriFieldTypeDate": field["type"] = "date" # 写入修改后的数据,w模式自动清空原文件 with open(file_path, "w", encoding="utf-8") as f: json.dump(data, f, indent=1)
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

