You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

问题原因

  • 路径存在两处错误:
    1. 读写路径不一致:读取的是C盘根目录的last_esri.json,写入的是C盘data文件夹下的last_esri.json,如果之前调试时用追加模式往data目录下的文件写过内容,很容易出现内容堆叠。
    2. Windows路径未做转义处理:Python字符串中\是转义字符,直接写"C:\data\last_esri.json"这类路径会被解析为错误地址,触发意料之外的文件写入行为。
  • 对文件打开模式的逻辑理解有误:
    1. w/w+模式打开文件的瞬间,就会自动把原文件截断为空,根本不需要手动调用seek(0)移动指针。
    2. 如果用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:51:17