在python中从文本文件读取字典结构

在python中从文本文件读取字典结构,python,dictionary,serialization,deserialization,Python,Dictionary,Serialization,Deserialization,我有一个定义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 readOb

我有一个定义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

这也适用于较大的词典。我想问有没有更好的方法?我知道
pickle
模块,但这不是我想要的,因为它以自己的格式存储数据。由于与python dicts相似,我正在考虑用于解析json的模块,但我不知道这种方法是否安全。

您拥有的文件实际上代表了字典的人工解释版本。我们可以阅读它,看看有一个变量是如何分配给字典的。您真正想要做的是以编程友好的格式存储dict。JSON就是这种格式的完美运用。其他格式包括XML和YAML,但Python本身可以轻松读取JSON输入

如果仔细查看示例,您会发现示例数据集有一个带有嵌套字典的字典。JSON是为这些类型的用例构建的。因此,包含上述数据的JSON文件如下所示:

{
    "Name": "Zara", 
    "Age": 7, 
    "Class": "First", 
    "Friends": {
        "Emil":1, 
        "Frank":0
    } 
}
注意,子字典是JSON文件结构的一部分。还要注意,使用了双引号

现在,您可以轻松地让python为您完成工作:

import json
from os import open
from pprint import pprint

data = open(filename).read()
d = json.loads(data)
pprint(d)
您可以通过以下方式访问子模块:

d['Friends]

您拥有的文件实际上代表了字典的人工解释版本。我们可以阅读它,看看有一个变量是如何分配给字典的。您真正想要做的是以编程友好的格式存储dict。JSON就是这种格式的完美运用。其他格式包括XML和YAML,但Python本身可以轻松读取JSON输入

如果仔细查看示例,您会发现示例数据集有一个带有嵌套字典的字典。JSON是为这些类型的用例构建的。因此,包含上述数据的JSON文件如下所示:

{
    "Name": "Zara", 
    "Age": 7, 
    "Class": "First", 
    "Friends": {
        "Emil":1, 
        "Frank":0
    } 
}
注意,子字典是JSON文件结构的一部分。还要注意,使用了双引号

现在,您可以轻松地让python为您完成工作:

import json
from os import open
from pprint import pprint

data = open(filename).read()
d = json.loads(data)
pprint(d)
您可以通过以下方式访问子模块:

d['Friends]

您拥有的文件实际上代表了字典的人工解释版本。我们可以阅读它,看看有一个变量是如何分配给字典的。您真正想要做的是以编程友好的格式存储dict。JSON就是这种格式的完美运用。其他格式包括XML和YAML,但Python本身可以轻松读取JSON输入

如果仔细查看示例,您会发现示例数据集有一个带有嵌套字典的字典。JSON是为这些类型的用例构建的。因此,包含上述数据的JSON文件如下所示:

{
    "Name": "Zara", 
    "Age": 7, 
    "Class": "First", 
    "Friends": {
        "Emil":1, 
        "Frank":0
    } 
}
注意,子字典是JSON文件结构的一部分。还要注意,使用了双引号

现在,您可以轻松地让python为您完成工作:

import json
from os import open
from pprint import pprint

data = open(filename).read()
d = json.loads(data)
pprint(d)
您可以通过以下方式访问子模块:

d['Friends]

您拥有的文件实际上代表了字典的人工解释版本。我们可以阅读它,看看有一个变量是如何分配给字典的。您真正想要做的是以编程友好的格式存储dict。JSON就是这种格式的完美运用。其他格式包括XML和YAML,但Python本身可以轻松读取JSON输入

如果仔细查看示例,您会发现示例数据集有一个带有嵌套字典的字典。JSON是为这些类型的用例构建的。因此,包含上述数据的JSON文件如下所示:

{
    "Name": "Zara", 
    "Age": 7, 
    "Class": "First", 
    "Friends": {
        "Emil":1, 
        "Frank":0
    } 
}
注意,子字典是JSON文件结构的一部分。还要注意,使用了双引号

现在,您可以轻松地让python为您完成工作:

import json
from os import open
from pprint import pprint

data = open(filename).read()
d = json.loads(data)
pprint(d)
您可以通过以下方式访问子模块:

d['Friends]

我假设您无法控制文件格式,并且从某个地方将其传递给您。它与json非常接近,因此我的目标是使其成为json。我会做如下的事情:

lines = []
with open(file) as f:
    for line in f:
        if line[0] == "#":
            continue
        l = line.strip().split("=")[-1].strip(";")
        lines.append(re.sub("'", "\"", l)
return json.loads("".join(lines))

我假设您无法控制文件格式,并且从某个地方将其传递给您。它与json非常接近,因此我的目标是使其成为json。我会做如下的事情:

lines = []
with open(file) as f:
    for line in f:
        if line[0] == "#":
            continue
        l = line.strip().split("=")[-1].strip(";")
        lines.append(re.sub("'", "\"", l)
return json.loads("".join(lines))

我假设您无法控制文件格式,并且从某个地方将其传递给您。它与json非常接近,因此我的目标是使其成为json。我会做如下的事情:

lines = []
with open(file) as f:
    for line in f:
        if line[0] == "#":
            continue
        l = line.strip().split("=")[-1].strip(";")
        lines.append(re.sub("'", "\"", l)
return json.loads("".join(lines))

我假设您无法控制文件格式,并且从某个地方将其传递给您。它与json非常接近,因此我的目标是使其成为json。我会做如下的事情:

lines = []
with open(file) as f:
    for line in f:
        if line[0] == "#":
            continue
        l = line.strip().split("=")[-1].strip(";")
        lines.append(re.sub("'", "\"", l)
return json.loads("".join(lines))

你为什么不直接pickle呢?这与JSON非常接近,没有理由不使用它。你绝对不想做的一件事是尝试将内容存储为Python源代码,然后通过尝试用正则表达式解析来读取它们……不管怎样,你说的“安全”是什么意思?JSON和
literal\u eval
都是非常有限的格式,因此通常对大多数事情都是安全的,但是如果不知道您担心的是哪种攻击,很难比that@WakanTanka:如果Python dict包含无法用JSON正确编写的内容,然后在保存时(
json.dump
json.dumps
)会出现错误-这比使用
repr
保存它要好得多(这将始终成功),然后直到原始数据可能不再存在时加载时(
literal\u eval
)才会出现错误。(与之相当接近的是,在JSON
转储
/
加载
中失败的事情与在
repr
/
文本评估
中失败的事情是一样的)为什么不直接进行pickle处理呢?这与JSON非常接近,没有理由不使用它,有一件事你肯定不想做,那就是尝试将东西存储为Python源代码,然后将它们读回b