Python实现CSV转JSON时删除嵌套字典指定键的操作失效问题
错误原因定位
你之前的删除操作失效,核心是操作对象的层级搞错了:
- 外层的
data字典,它的顶层键是每个CSV行里ipadd对应的取值(比如示例中的some_random_key、some_random_key2) - 你要移除的
number、ipadd两个字段,是每个外层键所对应的内层子字典的字段,根本不是外层data的顶层键 - 你之前写的
del data['number']操作的是外层字典,既找不到叫number的顶层键(会直接报KeyError),也根本碰不到内层子字典里的目标字段,自然达不到预期效果。
你担心提前删除CSV行里的ipadd字段会导致没法生成外层键的问题完全可以规避:先把ipadd的值提取出来当外层键,再对行数据做过滤/删除操作即可,两者完全不冲突。
修正实现
方案1(推荐:字典推导式过滤)
这种写法可扩展性强,后续要调整需要排除的字段,只要修改排除集合即可,不需要重复写删除语句:
import csv, json def make_json(csvFilePath, jsonFilePath): data = {} # 集中配置需要从最终JSON中移除的字段 EXCLUDE_FIELDS = {'number', 'ipadd'} with open(csvFilePath, encoding='utf-8') as csvf: csvReader = csv.DictReader(csvf) for rows in csvReader: # 第一步:先提取ipadd值作为外层JSON的键,此时还未删除该字段,可正常取值 outer_key = rows['ipadd'] # 第二步:对当前行数据做过滤,去掉配置的排除字段,生成干净的子字典 filtered_row = { field: value for field, value in rows.items() if field not in EXCLUDE_FIELDS } # 第三步:把过滤后的子字典存入外层结果 data[outer_key] = filtered_row # 写入最终JSON,ensure_ascii=False避免非英文字符被转义 with open(jsonFilePath, 'w', encoding='utf-8') as jsonf: jsonf.write(json.dumps(data, indent=4, ensure_ascii=False)) csvFilePath = r'csvfile.csv' jsonFilePath = r'demo.json' make_json(csvFilePath, jsonFilePath)
- 小提示:原代码中导入的
pandas、os模块在当前逻辑里没有被实际调用,属于冗余导入,可以直接移除精简程序,不会影响运行效果。
方案2(沿用原本的del写法)
如果习惯用del删除字段的写法,只要把删除操作的目标从外层data改成每一行的rows字典即可,对应循环内的逻辑修改为:
for rows in csvReader: key = rows['ipadd'] # 直接对当前行的字典做删除,不要操作外层data del rows['number'] del rows['ipadd'] data[key] = rows
最终输出效果
两种方案运行后,生成的JSON结构和你期望的完全一致:
{ "some_random_key": { "version": "0", "name": "superman", "devicename": "0", "osversion": "0" }, "some_random_key2": { "version": "0", "name": "batman", "devicename": "0", "osversion": "0" } }
内容的提问来源于stack exchange,提问作者Ankzious
相关产品推荐
相关产品推荐

