【问题标题】:Reading dictionary structure from text file in python从python中的文本文件中读取字典结构
【发布时间】: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.dumpjson.dumps )—这比使用repr 保存它(这将始终成功)然后直到加载时间(literal_eval)才出现错误要好得多,因为您的原始数据可能不再存在。 (并且非常接近,JSON dumps/loads 中将失败的事情与repr/literal_eval 中将失败的事情相同。)

标签: python dictionary serialization deserialization


【解决方案1】:

我假设您无法控制文件格式并且是从某个地方传递过来的。它与 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 和 python dicts 都是等效的(在语法上)。例如,如果 python dict 包含无法正确写入 json 的内容(这可能吗?),那么 json 解析器将无法识别?
【解决方案2】:

您拥有的文件确实代表了字典的人工解释版本。我们可以阅读它并查看我们想要分配给字典的变量。你真正想做的是以编程友好的格式存储字典。而 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 和 python dicts 都是等价的(在语法上)。例如,如果 python dict 包含无法正确写入 json 的内容(这可能吗?),那么 json 解析器将无法识别?
  • JSON 有自己的规范,Python JSON 解析模块有很多限制 (docs.python.org/2/library/…)。但是,它涵盖了很多很多常见的用例。
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2021-05-14
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
相关资源
最近更新 更多