Python 3.7中如何实现复杂列表与字符串的相互转换?
解决复杂嵌套列表/元组的序列化与反序列化问题
嘿,这个场景我太熟悉了!用str()把复杂嵌套结构转成字符串存文件,确实会卡在还原这一步——毕竟字符串只是文本,没法直接变回原对象。不过有两个靠谱的方案,分情况给你说:
方案一:还原已用str()保存的数据
如果你已经用str()把数据写入文件了,那用ast.literal_eval()是最安全的还原方式,比直接用eval()靠谱多了(eval()会执行字符串里的任意代码,风险很高)。
ast.literal_eval()专门负责解析字符串形式的Python字面量(比如列表、元组、数字、字符串这些),完美支持多层嵌套结构,完全能还原你示例里的复杂列表。
代码示例:
import ast filename = "your_file.txt" # 读取文件中的字符串 with open(filename, 'r') as f: saved_str = f.read() # 还原为原列表/元组结构 original_data = ast.literal_eval(saved_str) # 验证一下结构是否正确 print(type(original_data)) # 应该输出 <class 'list'> print(original_data[0][0]) # 会输出你原来的第一个嵌套元组
方案二:更适合长期使用的序列化方案
如果以后还要处理这类复杂嵌套结构,更推荐用pickle模块——它是Python专门用来序列化对象的工具,能直接保存和还原几乎所有Python内置类型(包括嵌套元组、列表,甚至自定义类对象),不用手动转字符串,效率更高,也不会有格式问题。
写入文件代码:
import pickle filename = "your_data.pkl" objs = [(((0.0, 0.0, 0.0), (1000.0, 0.0, 0.0), (0.0, 2.0, 0.0), (1000.0, 2.0, 0.0), (0.0, 0.0, 1000.0), (1000.0, 0.0, 1000.0), (0.0, 2.0, 1000.0), (1000.0, 2.0, 1000.0)), ((0, 2, 3, 1), (4, 6, 7, 5), (1, 3, 7, 5), (4, 6, 2, 0), (2, 6, 7, 3), (4, 0, 1, 5)), ((255, 0, 0), (255, 128, 0), (255, 255, 0), (255, 255, 255), (0, 0, 255), (0, 255, 0)))] with open(filename, 'wb') as f: pickle.dump(objs, f)
读取文件代码:
import pickle filename = "your_data.pkl" with open(filename, 'rb') as f: original_objs = pickle.load(f) # 直接得到和原数据完全一致的结构 print(original_objs)
注意:
pickle生成的是二进制文件,不能用文本编辑器直接查看;如果需要能手动查看的格式,也可以用yaml模块(需要先安装pyyaml),它支持保留元组结构,而且输出是人类可读的文本。
内容的提问来源于stack exchange,提问作者Grud Grud
相关产品推荐
相关产品推荐

