JSON标注数据提取URL与分类值写入CSV的行转列实现问题
解决方案
你现有代码的问题是每提取一个字段就单独调用一次writerow写入一行,所以单条数据的三个字段会被拆分到三行。调整逻辑为:先组装完成单条数据的所有列内容,再一次性写入一行即可。
修改后代码(更稳定,不依赖分类顺序)
import csv # 定义CSV表头,可按需修改列名 headers = ['Labeled Data URL', 'bathroom_size', 'bathroom_quality'] with open('test3.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) # 写入表头 writer.writerow(headers) for bill in data: # 提取URL字段 url = bill["Labeled Data"] size_val = None quality_val = None # 按分类标题匹配对应值,避免JSON分类顺序变化导致列错位 for item in bill["Label"]["classifications"]: if item["title"] == "What is the size of bathoom?": size_val = item["answer"]["value"] elif item["title"] == "What quality is the bathroom?": quality_val = item["answer"]["value"] # 三个字段组装为一行写入 writer.writerow([url, size_val, quality_val])
简化写法(仅适用于classifications数组顺序固定的场景)
如果你确定每条数据的classifications数组永远是「面积分类在前、质量分类在后」,可以简化为按索引直接取值:
import csv headers = ['Labeled Data URL', 'bathroom_size', 'bathroom_quality'] with open('test3.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(headers) for bill in data: url = bill["Labeled Data"] size_val = bill["Label"]["classifications"][0]["answer"]["value"] quality_val = bill["Label"]["classifications"][1]["answer"]["value"] writer.writerow([url, size_val, quality_val])
补充说明:代码中添加
newline=''是Python写CSV的标准配置,可避免Windows系统下生成的CSV出现多余空行;指定encoding='utf-8'可避免特殊字符乱码。
内容的提问来源于stack exchange,提问作者saraherceg
相关产品推荐
相关产品推荐

