Python:从Textfile中读取字典

时间:2017-12-09 16:42:08

标签: python dictionary

我遇到了一个丑陋的问题。我正在提供以下文本文件,该文件是从另一个Python文件输出的。从之前的文件中,它是一个吐出到此文本文件中的字典。

文本文件(名为'output.txt'):

0:[([(11, 191), (11, 170), (14, 170), (11, 188)], [0.7830932724146064, 0.7789413675533634, 0.7714495149543579, 0.7688444764225846])]
90:[([(95, 170), (95, 2), (119, 2), (95, 146)], [0.7830932724146064, 0.7789413675533634, 0.7714495149543579, 0.7688444764225846])]
180:[([(182, 2), (182, 23), (179, 23), (182, 5)], [0.7830932724146064, 0.7789413675533634, 0.7714495149543579, 0.7688444764225846])]
270:[([(98, 23), (98, 191), (74, 191), (98, 47)], [0.7830932724146064, 0.7789413675533634, 0.7714495149543579, 0.7688444764225846])]

我对阅读文本文件非常熟悉,但这个让我感到难过。关于整个问题的愚蠢之处在于我实际上需要以字典格式提供给我的文件,所以我基本上只是尝试读取文件,因为它是给我的。 问题在于读取它时,Python不知道它是字典而是给我字符串。无论如何都要将字典的值作为列表列表而不是仅仅读取字符串(如下所示)?非常感谢!

d = {}
with open("output.txt") as f:
    for line in f:
        d_line = line.rstrip('\n').split(':')
        d[int(d_line[0])] = d_line[1]

print(d)

{0: '[([(11, 191), (11, 170), (14, 170), (11, 188)], [0.7830932724146064, 0.7789413675533634, 0.7714495149543579, 0.7688444764225846])]', 90: '[([(95, 170), (95, 2), (119, 2), (95, 146)], [0.7830932724146064, 0.7789413675533634, 0.7714495149543579, 0.7688444764225846])]', 180: '[([(182, 2), (182, 23), (179, 23), (182, 5)], [0.7830932724146064, 0.7789413675533634, 0.7714495149543579, 0.7688444764225846])]', 270: '[([(98, 23), (98, 191), (74, 191), (98, 47)], [0.7830932724146064, 0.7789413675533634, 0.7714495149543579, 0.7688444764225846])]'}

2 个答案:

答案 0 :(得分:2)

您可以在此处使用eval

dict_from_file = {}
with open('output.txt','r') as f:
    for line in f:
        d_line = line.rstrip('\n')
        dict_from_file.update(eval('{{{0}}}'.format(d_line))) 

或者保持紧凑:

with open('output.txt', 'r') as f:
    dict_from_file = eval('{{{0}}}'.format(','.join(f.readlines()))

请注意:eval不是保存方法。 如果您对提供的内容eval不完全确定,请不要使用它!

替代方案是ast.literal_eval。您可以在eval处使用它。

在这种情况下,最好的方法是不要让第一个脚本将字典写为纯文本。使用像pickles这样的东西既省钱又简单!

答案 1 :(得分:2)

你很近,你可以使用ast.literal_eval来解释其余部分:

import ast
d = {}
with open("output.txt") as f:
   for line in f:
      d_line = line.rstrip('\n').split(':')
      d[int(d_line[0])] = ast.literal_eval(d_line[1])

print(d)

或者在一行中:

new_d = {int(key):ast.literal_eval(values) for key, values in [i.strip('\n').split(':') for i in open('output.txt')]}