使用eval可以把字符串转换成对象,它是一个功能强大的工具。比如:
>>> eval("1+1") # 将字符对象直接运算,得出运算结果
2
>>> eval("[1, 2, 3]") # 将字符串对象转变成列表对象
[1, 2, 3]
>>> eval("{'a': 1, 'b': 2}\n") # 将字符串对象转换成字典对象,并去除\n换行符
{'a': 1, 'b': 2}
>>>
但事实上,eval太强大,传给它的字符串的对象都会执行, 甚至会删除计算机上所有文件的表达式,只要权限够,它都会屁颠屁颠的去执行,比如说下面字符串对象:
>>> import os # 导入os模块
>>> eval("os.system('sudo rm -rf /*')") # 删除计算机里面的所有文件
如果想储存Python原生对象,但又无法信赖文件的数据来源,Python中的pickle模块是个理想的选择。pickle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具,也并不需要我们把字符串转换来转换去。是非常通用的数据格式化和解析工具。
-
使用pickle.dump来存储数据
>>> import pickle
>>> D = {'A': 1, 'B': 2}
>>> F = open("data.pkl", "wb") # 要存储到的具体文件名,打开类型为'wb'
>>> pickle.dump(D, F) # 使用dump方法存储文件
>>> F.close()
-
使用pickle.load来提取数据
>>> import pickle
>>> F = open("data.pkl", "rb") # 打开数据文件,具体类型'rb'
>>> E = pickle.load(F) # 使用load方法来导出数据
>>> E
{'A': 1, 'B': 2}
>>>