pandas读写CSV文件时如何避免嵌套列表出现多余双引号
异常原因
CSV是纯文本存储格式,本身不支持列表、字典这类复合Python数据类型。调用df.to_csv()写入时,pandas会自动将user列的列表对象强制转为字符串写入文件;后续用默认参数调用pd.read_csv()读取时,pandas会把该列识别为普通字符串类型,不会自动把字符串形式的列表还原为原生列表对象,最终读取到的就是带字符串标识的内容,和原始列表结构不一致。
可行解决方案
- 读取CSV时增加类型转换逻辑
不需要修改写入逻辑,读取时通过converters参数指定对应列的转换规则,用标准库ast的literal_eval方法安全将字符串格式的Python字面量还原为原生列表:
该方法可以在保留CSV存储格式的前提下,还原原始数据结构。import pandas as pd import ast # 读取时直接转换user列类型 df = pd.read_csv('users.csv', converters={'user': ast.literal_eval}) # 验证结果 print(df['user'].to_list()) # 输出:[['mary', 'jane'], ['alex', 'andrew']] - 更换为支持原生类型序列化的存储格式(推荐)
如果没有强制使用CSV的需求,优先选择parquet、pickle等pandas原生支持的存储格式,读写过程不会丢失任何数据类型信息,不需要额外写转换逻辑:
该方式读写后的DataFrame和原始对象结构、类型完全一致,不会出现类型转换异常。# 以parquet格式为例(需要提前安装pyarrow或fastparquet依赖) df.to_parquet('users.parquet') df = pd.read_parquet('users.parquet') # 以pickle格式为例(Python原生支持,不需要额外依赖) df.to_pickle('users.pkl') df = pd.read_pickle('users.pkl') - 写入前拆分列表列(非必要不推荐)
如果必须使用纯CSV格式且不想在读取时加转换逻辑,可以在写入前将列表列拆分为多列存储,但会改变原始表结构,仅适合特定业务场景使用。
内容的提问来源于stack exchange,提问作者nerd
相关产品推荐
相关产品推荐

