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())
【讨论】:
+1eval
绝对是最简单的事情。 @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
。如果您无法完全控制输入文件,则可能会导致安全问题。只需导入您的字典并使用json
或pickle
模块保存它们。
【讨论】:
我同意 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:从字典格式的文本/文件创建字典的主要内容,如果未能解决你的问题,请参考以下文章