如何将嵌套元组列表存入CSV并还原为原格式(无字符串化)
解决CSV读取后元组被字符串化的问题
这个问题很常见——CSV本质是纯文本格式,根本没有"元组"这种数据类型的概念,所以你用pandas保存的时候,它只能把元组转换成字符串形式写入文件,读取的时候自然就把这些字符串原封不动读回来了,不管用pandas还是原生csv模块都会遇到这个情况。
下面给你两种靠谱的解决思路:
方法一:用Pickle序列化(最简单,推荐)
如果不需要用Excel这类工具查看文件内容,直接用Python的pickle模块保存整个列表结构是最省心的,它能直接序列化Python对象,读取后完全还原原始结构:
保存代码:
import pickle # 你的原始嵌套列表L L = [[('a','b'), ('c','d')], [('e','f'), ('g','h')]] with open('MyLists.pkl', 'wb') as f: pickle.dump(L, f)
读取代码:
import pickle with open('MyLists.pkl', 'rb') as f: newList = pickle.load(f) print(newList) # 输出:[[('a', 'b'), ('c', 'd')], [('e', 'f'), ('g', 'h')]]
方法二:必须用CSV时,读取后转换字符串为元组
如果一定要用CSV(比如需要用文本编辑器或其他工具查看内容),可以用ast.literal_eval()把字符串形式的元组转换回真实元组——这个方法比直接用eval()安全得多,因为它只会解析合法的Python字面量(元组、列表、字符串等),不会执行恶意代码。
读取转换代码:
import pandas as pd import ast readdf = pd.read_csv('MyLists.csv', delimiter=";") # 遍历每个子列表,把每个字符串元素转成元组,同时处理空值(CSV里的空单元格会变成NaN) newList = [] for sublist in readdf.values.tolist(): cleaned_sublist = [] for item in sublist: if pd.notna(item): # 跳过空值 cleaned_sublist.append(ast.literal_eval(item)) newList.append(cleaned_sublist) print(newList) # 输出:[[('a', 'b'), ('c', 'd')], [('e', 'f'), ('g', 'h')]]
为什么不用eval()?
举个例子,如果CSV里不小心混入了os.system('rm -rf /')这种字符串,eval()会直接执行它,而ast.literal_eval()会报错,不会执行危险代码,安全性拉满。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

