生成含JSON列的CSV文件时,如何设置正确的引号格式?
问题
需要从数据集生成可导入SQL数据库的CSV文件,其中sizes和colors列需以JSON格式存储。使用Python的csv.DictWriter生成的CSV中,这两列的引号格式不符合要求,目标格式要求:
- 列内容用单引号包裹(针对
sizes) - 方括号内的数据用双引号包裹(针对两列的内部元素)
当前代码
with open("export.csv", "w", newline="") as csvfile: # Create a CSV writer using the field/column names writer = csv.DictWriter( csvfile, fieldnames=csv_fields, ) # Write the header row (column names) writer.writeheader() for key in dict_products: print(dict_products[key]) writer.writerow(dict_products[key])
当前生成的CSV内容
id,prodcategory_id,name,featured,image_1,image_2,image_3,image_4,colors,sizes,article_number,price,manufacturer_id NULL,521,,0,521010000-1.jpg,,,,['1'],"['39', '41', '42', '43', '44', '45', '46']",521010000,6990,582 NULL,115,Women Court Sho,0,115130000-1.jpg,,,,['13'],"['36', '37', '38', '39', '40', '41']",115130000,4990,32
期望的CSV内容
id,prodcategory_id,name,featured,image_1,image_2,image_3,image_4,colors,sizes,article_number,price,manufacturer_id NULL,521,,0,521010000-1.jpg,,,,["1"],'["39", "41", "42", "43", "44", "45", "46"]',521010000,6990,582 NULL,115,Women Court Sho,0,115130000-1.jpg,,,,["13"],'["36", "37", "38", "39", "40", "41"]',115130000,4990,32
解决方案
核心思路是借助json.dumps()生成标准JSON格式字符串(自动用双引号包裹元素),再手动处理sizes的外层单引号,同时关闭CSV writer的自动引号逻辑避免冲突。
修改后的代码:
import json import csv with open("export.csv", "w", newline="") as csvfile: writer = csv.DictWriter( csvfile, fieldnames=csv_fields, quoting=csv.QUOTE_NONE, # 禁用自动添加双引号 escapechar='\\' # 防止字段内特殊字符破坏CSV结构 ) writer.writeheader() for product in dict_products.values(): # 将colors列表转为标准JSON(双引号包裹元素) product['colors'] = json.dumps(product['colors']) # 将sizes转为标准JSON后,外层套单引号 product['sizes'] = f"'{json.dumps(product['sizes'])}'" writer.writerow(product)
关键说明
json.dumps():直接将Python列表转为符合JSON规范的字符串,自动用双引号包裹元素,完美匹配内部格式要求。quoting=csv.QUOTE_NONE:关闭CSV writer自动为字段添加双引号的行为,避免干扰手动设置的单引号格式。escapechar='\\':如果字段内容包含逗号等特殊字符,会自动添加转义符,确保CSV结构不被破坏。- 外层单引号通过f-string直接拼接,确保
sizes字段最终输出符合要求。
内容的提问来源于stack exchange,提问作者teccrow
相关产品推荐
相关产品推荐

