Python - 将文本文件读入字典

时间:2013-12-05 21:59:49

标签: python file text dictionary

我最近开始用Python编程,我遇到了一个很大的问题。我正在尝试将列表形式的文本文件中的数据转换为Python中的字典。文本文件的格式一致格式如下所示:

@text {
    n = "test1",
    r = ["B:1", "G:2", "H:3", "O:4", "S:5", "W:6"],
    t = ["G:1","H:2"]
}

使用三个键:n,r和t;我将如何使用Python将文本文件中的值读入我的字典?

到目前为止,我已经设法开发了以下代码但没有成功,不知道我在哪里出错了,尽管尝试在整个网络上进行研究。

f = open('text.txt', 'r')
newDict = {}
for line in f:
    n, r, t = line.strip().split('=')
    newDict[k.strip()] = v.strip()

我是否沿着正确的方向行驶或完全脱离标记?从文本文件中将多个键和值读入字典的整个概念让我在导入/转换文件的过程中完全混淆。

非常感谢任何帮助 - 谢谢你提前。

4 个答案:

答案 0 :(得分:7)

你可以这样做:

for line in f:
    listedline = line.strip().split('=') # split around the = sign
    if len(listedline) > 1: # we have the = sign in there
        newDict[listedline[0]] = listedline[1]

但是,你想对这个dict中存储的数据做什么?它会将所有内容存储为字符串,因此您的列表将是一个大字符串。如果你需要更精确的数据,那不是太难,但你必须告诉我们你想用这个词来完成它是什么。

答案 1 :(得分:1)

如果你无法控制你的输入文本文件,你可以解析它们(可能不安全,所以确保输入)eval,见demo:

source = """@text {
    n = "test1",
    r = ["B:1", "G:2", "H:3", "O:4", "S:5", "W:6"],
    t = ["G:1","H:2"]
}"""
nrt = ' '.join(source.splitlines()[1:4])

此处nrt是带有nrt定义的空格连接线。要使其成为有效的python代码,请使用dict(..)和eval结果:

obj_code = 'dict({})'.format(nrt)
result = eval(obj_code)

最后:

>>> result
{'r': ['B:1', 'G:2', 'H:3', 'O:4', 'S:5', 'W:6'], 't': ['G:1', 'H:2'], 'n': 'test1'}

答案 2 :(得分:0)

不确定是否是这种情况,但如果您要输出所述文本文件,并尝试稍后再阅读,则可以使用Pickle而不是简单地写入文本文件。这允许您输出一个对象并在以后将其读回,即对象序列化。

举个例子:

import pickle

#to save object
pickle.dump(yourDict, open(yourFile, 'wb'))

#to load it back:
yourDict = pickle.load(open(yourFile, 'rb'))

答案 3 :(得分:0)

这是一次粗暴的尝试:

text = """
@text {
    n = "test1",
    r = ["B:1", "G:2", "H:3", "O:4", "S:5", "W:6"],
    t = ["G:1","H:2"]
}"""

import re
from collections import defaultdict
from ast import literal_eval

items = defaultdict(dict)
for name, lines in re.findall(r'(@\w+) {\s*(.*?)\s*}', text, flags=re.S):
    for var, val in re.findall(r'\s*(\w+)\s*=\s*(.*?),?$', lines, flags=re.M):
        items[name][var] = literal_eval(val)

# defaultdict(<type 'dict'>, {'@text': {'r': ['B:1', 'G:2', 'H:3', 'O:4', 'S:5', 'W:6'], 't': ['G:1', 'H:2'], 'n': 'test1'}})