如何处理含列表字典格式字符串的CSV文件?
解决CSV嵌套结构扁平化的问题
问题分析
你拿到的CSV里product列是嵌套字典/列表的字符串,直接截取字符串片段无法获取深层字段,必须先把这个字符串转换成Python可操作的数据结构,再逐层提取目标内容。
解决方案代码
import csv import json # 定义目标表头 target_headers = [ 'id', 'name', 'product.id', 'product.status', 'productRatePlan.id', 'productRatePlan.name', 'productRatePlan.currency', 'productRatePlan.price' ] with open('original.csv', 'r', encoding='utf-8') as infile, open('flattened.csv', 'w', newline='', encoding='utf-8') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) # 写入目标表头 writer.writerow(target_headers) # 跳过原始文件的表头行 next(reader) for row in reader: original_id, original_name, product_str = row # 清理product字符串:替换单引号为双引号,去掉首尾错误的列表包裹 cleaned_product = product_str.replace("'", '"')[1:-1] # 转换为Python字典 product_data = json.loads(cleaned_product) # 逐层提取嵌套字段 product_id = product_data['id'] product_status = product_data['status'] # 处理productRatePlan列表(取第一个元素) prp = product_data['productRatePlan'][0] prp_id = prp['id'] prp_name = prp['name'] # 处理pricing列表(取第一个元素) pricing = prp['pricing'][0] currency = pricing['currency'] price = pricing['price'] # 组装输出行并写入 output_row = [ original_id, original_name, product_id, product_status, prp_id, prp_name, currency, price ] writer.writerow(output_row)
关键步骤说明
- 字符串转数据结构:原
product列用单引号,不符合JSON规范,先替换为双引号;原数据错误地用列表包裹字典,所以去掉首尾的[],再用json.loads()转换成Python字典。 - 逐层提取字段:从字典里直接取顶层字段,嵌套的列表(比如
productRatePlan、pricing)取第一个元素后再提取内部字段。 - 写入新CSV:按照目标表头组装每行数据,写入新文件。
需要学习的知识点
- Python
csv模块:掌握读写CSV文件的基本方法,处理表头、行数据的逻辑。 - Python
json模块:理解JSON与Python字典/列表的对应关系,学会用loads()解析JSON字符串。 - 嵌套数据结构遍历:练习从多层嵌套的字典、列表中提取目标值,熟悉索引、键值访问的操作。
内容的提问来源于stack exchange,提问作者Ateeq
相关产品推荐
相关产品推荐

