使用Jq将非数组结构单行JSON文件映射转换为CSV的技术咨询
将每行独立JSON对象转换为指定字段的CSV的实现方法
针对你这种每行存储一个独立JSON对象(JSON Lines格式)的文件,要提取指定字段并转换成CSV,这里有几个实用的实现方案,你可以根据自己的场景选择:
方法一:使用jq命令行工具(快速便捷)
jq是处理JSON的老牌命令行工具,轻量高效,适合快速完成这类转换任务:
确保你已经安装了jq:
- Linux发行版通常自带,可通过
jq --version验证 - macOS可以用Homebrew安装:
brew install jq - Windows可以用Chocolatey:
choco install jq或直接下载官方二进制包
- Linux发行版通常自带,可通过
执行以下命令完成转换:
jq -r ' ["id", "lastUpdated", "identifier1", "identifier2", "identifier3", "code"], [.id, .meta.lastUpdated, .identifier[0].value, .identifier[1].value, .identifier[2].value, .code[0].coding[0].code] | @csv ' input.json > output.csv
命令解释:
-r:输出原始字符串(去掉JSON格式的引号)- 第一行数组定义CSV的表头
- 第二行数组从每个JSON对象中提取对应字段的值
@csv:将数组格式化为标准CSV格式input.json是你的输入文件路径,output.csv是生成的CSV文件路径
方法二:使用Python内置模块(无需额外依赖)
如果需要自定义逻辑或者不想用命令行工具,用Python内置的json和csv模块就能完成,兼容性拉满:
import json import csv # 定义字段映射:键是CSV列名,值是提取字段的逻辑函数 field_map = [ ("id", lambda data: data["id"]), ("lastUpdated", lambda data: data["meta"]["lastUpdated"]), ("identifier1", lambda data: data["identifier"][0]["value"]), ("identifier2", lambda data: data["identifier"][1]["value"]), ("identifier3", lambda data: data["identifier"][2]["value"]), ("code", lambda data: data["code"][0]["coding"][0]["code"]) ] # 获取CSV表头 headers = [col_name for col_name, _ in field_map] # 读写文件完成转换 with open("input.json", "r", encoding="utf-8") as json_in, \ open("output.csv", "w", newline="", encoding="utf-8") as csv_out: writer = csv.writer(csv_out) writer.writerow(headers) # 逐行解析JSON并写入CSV for line in json_in: json_data = json.loads(line.strip()) row_values = [extract_func(json_data) for _, extract_func in field_map] writer.writerow(row_values)
脚本解释:
- 逐行读取输入文件,避免一次性加载大文件到内存
- 用lambda函数明确每个字段的提取路径,后续修改字段时更方便
- 内置模块无需额外安装,适合任何Python环境
方法三:使用Python Pandas库(适合大数据量或数据分析场景)
如果你的数据量较大,或者后续需要做数据分析,用Pandas会更高效:
import pandas as pd # 读取JSON Lines格式的文件 df = pd.read_json("input.json", lines=True) # 从嵌套结构中提取字段并命名 df["lastUpdated"] = df["meta"].apply(lambda x: x["lastUpdated"]) df["identifier1"] = df["identifier"].apply(lambda x: x[0]["value"]) df["identifier2"] = df["identifier"].apply(lambda x: x[1]["value"]) df["identifier3"] = df["identifier"].apply(lambda x: x[2]["value"]) df["code"] = df["code"].apply(lambda x: x[0]["coding"][0]["code"]) # 选择需要的列并导出为CSV result_df = df[["id", "lastUpdated", "identifier1", "identifier2", "identifier3", "code"]] result_df.to_csv("output.csv", index=False, encoding="utf-8")
脚本解释:
pd.read_json(..., lines=True)专门适配每行一个JSON对象的格式apply函数快速处理嵌套的JSON结构- 导出时
index=False避免生成多余的索引列
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

