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

时间:2012-02-16 16:14:34

标签: python file dictionary external

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

  

{' fawn':[1],' sermersheim':[3],' sonji':[2],' scheuring&#39 ;:[2]}

除此之外,它包含125,000个条目。我能够使用read()读取文本文件,但是即使我用

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

dict = {}

6 个答案:

答案 0 :(得分:28)

您可以使用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提到的替代方法是使用比{eval更安全的ast.literal_eval,因为它只会评估包含文字的字符串。导入eval模块后,您只需将上述示例中的ast.literal_eval所有调用替换为ast

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

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

别忘了给inf.close()打电话。 with语句的优点在于它们可以为您完成,即使with语句中的代码块引发异常。

答案 1 :(得分:3)

使用eval可能会有危险。如果json不起作用,那么我建议使用yaml,它似乎与你的示例输入一起正常工作:

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

答案 2 :(得分:2)

使用eval功能。

例如,

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

答案 3 :(得分:2)

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

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

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

from my_file import my_dict 

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

您无法使用json模块,因为它的输入非常严格。