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

时间:2015-05-27 00:51:39

标签: 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 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的模块,但我不知道这种方法是否安全。

2 个答案:

答案 0 :(得分:2)

我假设您无法控制文件格式并且正在从某个地方传递它。它与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))

答案 1 :(得分:1)

您拥有的文件实际上代表了字典的人工解释版本。我们可以阅读它,看看有一个我们想要分配给字典的变量。你真正想做的是以编程的友好格式存储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]