Pandas能否在CSV中写入格式规范的列表与字典JSON数据?
Pandas导出CSV时列表/字典未生成有效JSON的解决方案
我之前也碰到过这个坑!Pandas默认导出包含列表、字典的列时,会直接用Python的repr()格式输出,完全不符合JSON规范,导致后续处理各种报错。先看你给出的示例:
示例代码
import pandas as pd x = pd.DataFrame({'id': [1], 'parsed_json': [[{'a': False}]]}) x.to_csv(index=False)
导出的CSV结果
id,parsed_json 1,[{'a': False}]
划重点:这里第二列的
[{'a': False}]用的是单引号,而JSON要求必须用双引号,所以这根本不是有效JSON,后续不管是重新读取还是其他系统解析都会出问题。
而且你提到的read_sql自动解析的问题也很棘手——它会把数据库里的JSON/文本数组直接转成Python原生类型,还没法关闭这个行为,这就导致导出CSV时的格式问题雪上加霜。
最靠谱的解决方案:手动将列转为标准JSON字符串
我们可以用json.dumps()把包含列表/字典的列强制转换成符合规范的JSON字符串,再导出CSV。
单列处理示例
import pandas as pd import json x = pd.DataFrame({'id': [1], 'parsed_json': [[{'a': False}]]}) # 把目标列转成标准JSON x['parsed_json'] = x['parsed_json'].apply(json.dumps) x.to_csv(index=False)
导出的正确CSV结果
id,parsed_json 1,"[{""a"": false}]"
现在第二列就是完全合法的JSON了,引号也符合规范,后续处理再也不会报错。
多列批量处理
如果有多个类似的列需要处理,可以用循环批量操作:
# 定义需要转换的列名列表 json_columns = ['parsed_json', 'user_metadata', 'product_details'] for col in json_columns: x[col] = x[col].apply(json.dumps)
重新读取时转回原生类型
如果之后需要把CSV里的JSON字符串再转回Python的列表/字典,可以在读取时用json.loads():
df = pd.read_csv('output.csv') df['parsed_json'] = df['parsed_json'].apply(json.loads)
这样一套流程下来,就能完美解决Pandas导出CSV时的JSON格式问题了。
内容的提问来源于stack exchange,提问作者tresbot
相关产品推荐
相关产品推荐

