从文本中解析键值对作为字典

时间:2017-06-06 07:55:57

标签: python file dictionary

我还不熟悉Python,我想知道如何将已经存在于key:value形式的文本文件转换为Python字典?

EG。

2:red 
3:orange 
5:yellow 
6:green 

(每个键:单独一行的值)

我看过其他帖子,但其中没有一个似乎有用,我知道我做错了什么。到目前为止,我有:

def create_colours_dictionary(filename):
    colours_dict = {}
    file = open(filename,'r')
    contents = file.read()

    for key in contents:
        #???
    return colours_dict

3 个答案:

答案 0 :(得分:1)

执行此操作的直接方法是使用传统的for循环和str.split方法。

我不是从文件中读取,而是将输入数据作为多行字符串嵌入到脚本中,并使用str.splitlines将其转换为字符串列表,因此我们可以循环它,就像循环文件的行一样。

# Use a list of strings to simulate the file
contents = '''\
2:red
3:orange
5:yellow
6:green
'''.splitlines()

colours_dict = {}
for s in contents:
    k, v = s.split(':')
    colours_dict[k] = v

print(colours_dict) 

<强>输出

{'2': 'red', '3': 'orange', '5': 'yellow', '6': 'green'}

请注意,只有冒号周围没有空格,此代码才能正常工作。如果可能有空格(或行的开头或结尾处的空格),则可以使用str.strip方法删除它们。

有几种方法可以使它更紧凑。

我们可以使用嵌套在字典理解中的列表理解:

colours_dict = {k: v for k, v in [s.split(':') for s in contents]}

但是在generator expression上使用dict构造函数更加紧凑:

colours_dict = dict(s.split(':') for s in contents)

如果您不熟悉理解,请参阅 官方教程中List ComprehensionsDictionaries

答案 1 :(得分:0)

迭代你的文件并建立一个字典。

def create_colours_dictionary(filename):
    colours_dict = {}
    with open(filename) as file:
        for line in file:
            k, v = line.rstrip().split(':')
            colours_dict[k] = v

    return colours_dict

dct = create_colours_dictionary('file.txt')

或者,如果你正在寻找紧凑的东西,你可以使用字母理解与lambda分裂冒号。

colours_dict = {k : v for k, v in (
    line.rstrip().split(':') for line in open(filename)
}

如果冒号被空格包围,这种方法需要进行一些修改 - 也许是正则表达式?

答案 2 :(得分:-1)

假设文本文件具有声明的'key:value'并且文件名包含在变量fname中,您可以编写一个函数来读取文件并返回dict或仅使用简单的with语句。

如果在代码中的多个位置执行此操作,则函数可能是更好的选择。如果只做一次2线程就行了。

    # Example with fname being the path to the textfile
    def dict_from(fname):
        return dict(line.strip().split(':') for line in open(fname))

    fname = '...'
    # ...
    d1 = dict_from(fname)

    # Alternative solution
    with open(fname) as fd:
       d2 = dict(line.strip().split(':') for line in fd)

两个建议的解决方案都使用内置的dict构造函数和生成器表达式来解析每一行。使用strip删除行的开头和结尾处的空白区域。使用split从每一行创建一个(键,值)对。