1. 前言 eval() 方法:
parts = ['[1, 2, 3]', "{'a':1, 'b':2}\n"]
eval(parts[0]) # [1, 2, 3]
objs = [eval(p) for P in parts]
print(objs) # [[1, 2, 3], {'a':1, 'b':2}]
使用 eval 可以把字符串转换成对象,因此它是一个功能强大的工具。事实上,它有时太过于强大,eval 会高高兴兴地执行 Python 的任何表达式,只要给予必要的权限,甚至可能删除计算机上所有文件的表达式。如果你真的想存储 Python原生对象,但又无法信赖文件的数据来源,那么Python标准库pickle模块将是理想的选择。
pickle 模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具,同时并不需要我们对字符串进行来回转换。
# Pickle any object to file
D = {'a':1, 'b':2}
F = open('datafile.pkl', 'wb')
import pickle
pickle.dump(D, F)
F.close()
# Load any object from file
F = open('datafile.pkl', 'rb')
E = pickle.load(F)
E # {'a':1, 'b':2}
2. pickle提供四个功能:dumps,dump,loads,load
1. pickle.dumps(obj) (将数据通过特殊的形式转换为只有python语言认识的字符串)
函数的功能:将 obj 对象序列化为 string 形式,而不是存入文件中,以字节对象形式返回封装的对象。
data = ['aa', 'bb', 'cc']
p_str = pickle.dumps(data)
print(p_str)
# b'\x80\x03]q\x00(X\x02\x00\x00\x00aaq\x01X\x02\x00\x00\x00bbq\x02X\x02\x00\x00\x00ccq\x03e.'
2. pickle.dump(obj, file, [,protocol]) (将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件)
参数:
必填参数 obj 表示将要封装的对象
必填参数 file 表示 obj 要写入的文件对象,file 必须以二进制可写模式打开,即 “wb”
with open('pickle_text.txt', 'wb') as f:
pickle.dump(data, f)
3. pickle.loads(bytes_object) (将 pickle 数据转换为 python 的数据结构)
mes = pickle.loads(p_str)
print(mes) # ['aa', 'bb', 'cc']
4. pickle.load(file,*,fix_imports=True, encoding="ASCII", errors="strict")
(从数据文件中读取数据,并转换为 python 的数据结构)
with open('pickle_text.txt', 'rb') as f:
data = pickle.load(f)
print(data)
参考文档:
https://www.cnblogs.com/fmgao-technology/p/9078918.html
https://baike.baidu.com/item/%E5%BA%8F%E5%88%97%E5%8C%96/2890184?fr=aladdin