使用Python将嵌套题库JSON导出为合规CSV时出现输出异常排查
嵌套题库JSON转CSV的问题修复与实现
已知问题梳理
- 源数据特征:嵌套结构的测验题库JSON,覆盖数学、体育两个学科,单题包含题干、选项列表、正确答案字段
- 已完成的代码环节:导入
json、csv标准库、读取本地JSON文件、实现自定义flatten扁平化方法、打开CSV输出流完成表头写入 - 异常表现:输出的CSV仅存在表头行,无实际题目数据;单独逐字段查询JSON嵌套内容时取值结果正常
- 已定位到的明显缺陷:CSV数据写入的核心语句被注释,未实际执行写入流程
分步实现方案
- 明确扁平化后的数据映射规则
嵌套结构转一维数据时,需要把外层的学科分类作为独立字段提取,同时处理列表类型的选项字段——由于CSV默认用逗号做分隔符,不能直接把列表对象写入单元格,需要把选项拼接成固定分隔符的字符串,避免格式错乱。 - 修正扁平化方法逻辑
遍历外层学科键值对,对每个学科下的题目列表逐行拆解,生成不含嵌套结构的一维字典,每个字典对应CSV的一行数据。 - 补全CSV写入逻辑
取消被注释的逐行写入代码,遍历扁平化处理后的所有题目记录,逐行写入CSV流,同时配置正确的编码、空行参数,避免中文乱码、行间距异常问题。
可参考的完整实现代码
import json import csv # 读取嵌套结构的源JSON文件 with open("source_question_bank.json", "r", encoding="utf-8") as f: raw_bank = json.load(f) def flatten_nested_bank(raw_data): """自定义嵌套数据扁平化方法""" flat_dataset = [] # 遍历外层的学科分类键 for subject_name, question_list in raw_data.items(): # 遍历单学科下的所有题目 for question in question_list: flat_dataset.append({ "subject": subject_name, "stem": question["stem"], # 选项列表转分号拼接字符串,规避CSV分隔符冲突 "option_content": "; ".join(question["options"]), "correct_answer": question["answer"] }) return flat_dataset # 执行扁平化处理 processed_data = flatten_nested_bank(raw_bank) # 写入目标CSV文件 with open("export_question_bank.csv", "w", encoding="utf-8-sig", newline="") as csv_file: # 定义CSV表头 header = ["subject", "stem", "option_content", "correct_answer"] csv_writer = csv.DictWriter(csv_file, fieldnames=header) # 写入表头行 csv_writer.writeheader() # 逐行写入数据(原代码中此环节被注释,需要取消注释) for row_data in processed_data: csv_writer.writerow(row_data)
易错点提示
- 打开CSV文件时必须添加
newline=""参数,否则Windows系统下生成的CSV会出现大量空行 - 编码选择
utf-8-sig而非普通utf-8,避免Excel打开时中文内容乱码 - 不要直接将列表、字典等复杂类型的字段写入CSV,否则会出现单元格格式不符合预期的问题
内容的提问来源于stack exchange,提问作者Running Rabbit
相关产品推荐
相关产品推荐

