【发布时间】:2015-05-27 00:51:39
【问题描述】:
我有文件,我在其中定义了 python 字典:
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First', 'Friends': {'Emil':1, 'Frank':0} };
我想阅读这本字典并在 python 代码中使用它的元素。我最终得到以下代码:
#!/usr/bin/python
import sys
import os
import ast
import re
from pprint import pprint as pp
def readObjFromFile(file):
with open (file, "r") as myfile:
data=myfile.read()
data = re.sub("^#.*", "", data)
data = data.replace('\n', '')
data = data.split("=", 1)[1].split(";", 1)[0].lstrip()
data = ast.literal_eval(data)
return data
if __name__ == "__main__":
if len(sys.argv[1:]) == 1:
dict = readObjFromFile(sys.argv[1])
print type(dict)
pp(dict)
else:
print "Pass file from which object will be read"
exit
这也适用于this 更大的字典。我想问是否有更好的方法来做到这一点?我知道pickle 模块,但这不是我想要的,因为它以自己的格式存储数据。由于与python dicts相似,我正在考虑用于解析json的模块,但我不知道这种方法是否安全。
【问题讨论】:
-
你为什么不泡菜呢?
-
这很接近 JSON,没有理由不使用它。
-
您绝对不想想要做的一件事是尝试将内容存储为 Python 源代码,然后通过尝试使用正则表达式对其进行解析来读取它们......跨度>
-
无论如何,“安全”是什么意思? JSON 和
literal_eval都是非常有限的格式,因此通常对于大多数的东西是安全的,但是不知道你担心什么样的攻击,很难说什么比这更详细 -
@WakanTanka:如果 Python dict 包含无法正确写入 JSON 的内容,那么您将在 save 时收到错误消息(
json.dump或json.dumps)—这比使用repr保存它(这将始终成功)然后直到加载时间(literal_eval)才出现错误要好得多,因为您的原始数据可能不再存在。 (并且非常接近,JSONdumps/loads中将失败的事情与repr/literal_eval中将失败的事情相同。)
标签: python dictionary serialization deserialization