Python 将文本中的键值对解析为字典

Python 将文本中的键值对解析为字典,python,file,dictionary,Python,File,Dictionary,我对Python还是一个新手,我想知道如何将文本文件中已经是key:value形式的内容转换成Python字典 例如 (每个键:单独一行上的值) 我看过其他的帖子,但似乎没有一篇有效,我知道我做错了什么。到目前为止,我已经: def create_colours_dictionary(filename): colours_dict = {} file = open(filename,'r') contents = file.read() for key in c

我对Python还是一个新手,我想知道如何将文本文件中已经是key:value形式的内容转换成Python字典

例如

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

我看过其他的帖子,但似乎没有一篇有效,我知道我做错了什么。到目前为止,我已经:

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

    for key in contents:
        #???
    return colours_dict

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

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的dict理解在冒号上拆分

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

如果冒号被空格包围,这种方法将需要一些修改,例如regex?

假设文本文件具有声明的“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
从每一行创建(键、值)对。

直接的方法是使用传统的
for
循环和方法

我将以多行字符串的形式将输入数据嵌入脚本中,并使用将其转换为字符串列表,这样我们就可以在其上循环,就像在文件的行上循环一样

# 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'}
请注意,只有在冒号周围没有空格时,此代码才能正常工作。如果可能存在空格(或在行的开始或结束处存在空格),则可以使用该方法将其删除


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

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

colours_dict = {k: v for k, v in [s.split(':') for s in contents]}
但在以下情况下使用
dict
构造函数更为紧凑:

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

在每个
x上调用
x.split(“:”)
两次效率有点低。此外,该算法有点脆弱:如果分隔符不完全是
:“
,即,如果中间有空格,则该算法将失败。@PM2Ring我同意。但修复这一问题需要一个循环,而不是理解。前者不是更具python风格和可读性吗?定界符完全基于OP的问题。当然,可以使用
:“
定界符,但如果冒号周围有空格,则该算法将不起作用。使用理解并不一定更像python:如果它的效率低于传统的
循环解决方案,那么最好使用传统的循环。但是,有几种方法可以避免double
.split
调用。@PM2Ring是有意义的。我将保留我的答案,因为您已经探索了其他方法。
colours_dict = {k: v for k, v in [s.split(':') for s in contents]}
colours_dict = dict(s.split(':') for s in contents)