它与此完全相同,只不过包含了 125,000 条记录。我可以使用read()方法读取文本文件,但即使我使用以下初始化变量的方式:{'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}
它也会创建一个包含文本的变量。dict = {}
它与此完全相同,只不过包含了 125,000 条记录。我可以使用read()方法读取文本文件,但即使我使用以下初始化变量的方式:{'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}
它也会创建一个包含文本的变量。dict = {}
你可以使用内置函数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
语句(不太重要),也没有ast
模块。 - Steven T. Snyderast.literal_eval
,而不是ast.literaleval
。 - Taylor D. Edmistoneval
确实是最简单的方法。但是 @JBernardo 提到的 ast.literal_eval
更安全,因为它只允许字符串、数字、元组、列表、字典、布尔值和 None。这是需要考虑的事情。 - istrubleeval
的使用可能是危险的。如果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
。 - jcollado这不是一个可用于生产环境的解决方案,可能无法很好地处理您的文件大小,但如果您需要一种简单的方法并且能够在您的文件前添加内容,则可以使用它。
my_dict = {'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}
from my_file import my_dict
我强烈不建议使用eval
。如果您无法完全控制输入文件,可能会导致安全问题。只需导入您的字典并使用json
或pickle
模块保存它们。
pickle
时遇到问题的提问,因为那似乎是真正的问题所在。 - jcolladojson
模块对其输入有严格要求。 - Marcin
ast.literal_eval
是一个Python模块中的函数,它可以安全地将字面量字符串转换为对应的Python数据类型。 - JBernardoast
模块在2.5中被引入,但没有辅助函数(如literal_eval
)。这些函数在2.6中出现。 - Steven T. Snyder