Python:从字典格式的文本/文件创建字典

Posted

技术标签:

【中文标题】Python:从字典格式的文本/文件创建字典【英文标题】:Python: Create Dictionary from Text/File that's in Dictionary Format 【发布时间】:2012-03-08 01:26:50 【问题描述】:

我想从我拥有的文本文件中创建一个字典,其内容为“字典”格式。以下是文件包含的示例:

'小鹿':[1],'sermersheim':[3],'sonji':[2],'scheuring':[2]

除了它包含 125,000 个条目之外,就是这样。我可以使用 read() 读取文本文件,但即使我使用

初始化变量,它也会创建文件文字文本的变量

dict =

【问题讨论】:

ast.literal_eval @JBernardo +1,只要你有 Python 2.6 或更高版本,这就是要走的路。 ast 模块是在 2.5 中引入的,但没有辅助函数(例如 literal_eval)。那些来自 2.6。 @JBernardo,最佳答案 【参考方案1】:

对我来说这看起来像 json。如果是这样,请使用json 模块。

这对我来说看起来像 yaml。如果是这样,请使用pyyaml module。 (正如@jcollado 所建议的那样)。

您不能使用 json 模块,因为它对其输入很严格。

【讨论】:

不是 JSON:它使用单引号而不是双引号。 @NedBatchelder:是的。我没有意识到json 模块对它的输入很严格。【参考方案2】:

使用eval 函数。

例如,

dict = eval(open("yourfile.txt").read())

【讨论】:

+1 eval 绝对是最简单的事情。 @JBernardo 关于 ast.literal_eval 的评论更安全,因为它只允许字符串、数字、元组、列表、字典、布尔值和无。只是需要考虑的事情。【参考方案3】:

您可以使用内置的eval。例如,如果每个字典条目都在不同的行上,这将起作用:

dicts_from_file = []
with open('myfile.txt','r') as inf:
    for line in inf:
        dicts_from_file.append(eval(line))    
# dicts_from_file now contains the dictionaries created from the text file

或者,如果文件只是一个大字典(甚至是多行),您可以这样做:

with open('myfile.txt','r') as inf:
    dict_from_file = eval(inf.read())

这可能是最简单的方法,但也不是最安全的。正如其他人在回答中提到的那样,eval 具有一些固有的安全风险。正如 JBernardo 所提到的,另一种方法是使用ast.literal_eval,它比 eval 更安全,因为它只会评估包含文字的字符串。在导入ast 模块后,您可以简单地将上述示例中对eval 的所有调用替换为ast.literal_eval

如果您使用的是 Python 2.4,您将不会拥有 ast 模块,也不会拥有 with 语句。代码看起来更像这样:

inf = open('myfile.txt','r')
dict_from_file = eval(inf.read())
inf.close()

别忘了致电inf.close()with 语句的美妙之处在于它们为您执行此操作,即使 with 语句中的代码块引发了异常。

【讨论】:

如果它只是一堵墙怎么办?它实际上只是一个以 开头并以 结尾的实心字符串。 如果只有一行,它会起作用,但如果字典分布在一行以上,它就不起作用。我为那个案例添加了额外的代码。 我得到一个“无效语法”,其中 > "with open('myfile.txt','r') as inf: 行。 您使用的是 Python 2.5 还是更新版本? 仅供参考:看起来方法现在是ast.literal_eval,而不是ast.literaleval【参考方案4】:

我强烈反对使用eval。如果您无法完全控制输入文件,则可能会导致安全问题。只需导入您的字典并使用jsonpickle 模块保存它们。

【讨论】:

我同意 eval 如果定期使用或在生产代码中使用会带来巨大的安全风险,我将原始问题解释为处理来自受信任来源的孤立代码位,并且是已经在一个文本文件中。在这种情况下,您无能为力。 它在来自可信来源的静态文件中,是的! 而且我对泡菜文件没有运气。我在 .pickle 文件中有相同的信息,但似乎无法将其重新加载。此代码在无法访问 Internet 的受限系统上运行。 @Jared 也许你应该发布一个关于pickle 问题的问题,因为这似乎是真正的问题。【参考方案5】:

使用eval 可能很危险。如果 json 不起作用,那么我建议使用 yaml,这似乎与您的示例输入配合良好:

>>> import yaml
>>> yaml.load("'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]")
'fawn': [1], 'scheuring': [2], 'sermersheim': [3], 'sonji': [2]

【讨论】:

啊,我想用这个,但我没有模块,并且运行代码的系统无法访问互联网。还是谢谢! 您可能还是要考虑从源代码安装。根据文档,应该很简单:python setup.py install.【参考方案6】:

这不是一个生产就绪的解决方案,可能不适用于您大小的文件,但如果您需要一种简单的方法并且可以将您的文件添加到

my_dict = 'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]

然后您可以将其重命名为 python 文件并简单地导入

from my_file import my_dict 

【讨论】:

以上是关于Python:从字典格式的文本/文件创建字典的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件导入数据时向预先存在的字典键添加值(Python 3)

从 CSV 文件创建字典

读取csv字典变成str了怎么办

Python - 如何在文本文件中制作字典?

从文本文件的字典

如何将字典的文本文件读入 DataFrame