Python解析JSON遇TypeError: write()参数需str而非None的求助
问题分析与解决方案
核心问题拆解
你的代码存在多个导致报错和功能失效的问题:
- 未导入
json模块,代码运行会直接抛出NameError output、locationJSON变量未定义,无法指定文件路径json.dumps(key)会给输入的key额外添加引号(比如输入name会变成"name"),导致data.get()找不到对应键,返回None,触发write()参数类型错误- 未循环处理输入的多个keys,仅处理单个key
- 写入格式不符合目标数组结构,且未处理嵌套JSON的键提取
修正后的完整代码
import json import csv # 定义文件路径(替换为你的实际路径) locationJSON = "input.json" output_json = "extracted_data.json" output_csv = "extracted_data.csv" # 获取要提取的键,支持嵌套键(用点分隔,比如"user.profile.name") keys = [k.strip() for k in input('Enter the keys you want to extract separated by commas: ').split(',')] def get_nested_value(data, key_path): """从嵌套JSON中提取指定路径的值""" keys = key_path.split('.') current = data for k in keys: if isinstance(current, dict) and k in current: current = current[k] else: return None return current # 读取原始JSON数据 with open(locationJSON, "r") as fi: data = json.load(fi) # 收集提取的键值对,生成目标格式的列表 extracted_list = [] for key in keys: value = get_nested_value(data, key) # 仅添加存在的键值对,避免None值 if value is not None: extracted_list.append({key: value}) # 写入JSON文件 with open(output_json, "w") as f: json.dump(extracted_list, f, indent=2) # 转CSV文件 if extracted_list: with open(output_csv, "w", newline='') as csvfile: fieldnames = extracted_list[0].keys() writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerows(extracted_list)
关键改进说明
- 嵌套键支持:新增
get_nested_value函数,通过点分隔的路径(如user.address.city)提取多层嵌套的JSON值 - 错误避免:跳过不存在的键(返回None时不加入结果),避免写入空值导致的报错
- 格式合规:直接用
json.dump生成标准的数组格式JSON,无需手动拼接字符串 - CSV转换:自动将提取的JSON数组转为CSV,方便数据分析
- 变量定义:明确指定输入输出文件路径,避免未定义错误
测试说明
- 替换
locationJSON为你的原始JSON文件路径 - 运行代码后输入要提取的键,比如
id,name,user.email - 生成的
extracted_data.json会严格符合你期望的数组格式,extracted_data.csv可直接用于数据分析
内容的提问来源于stack exchange,提问作者Andres Pachano
相关产品推荐
相关产品推荐

