使用eval具有混合格式列表的外部文件

时间:2018-10-06 07:31:44

标签: python list eval mixed

我正在将以下单行数据读取,更新并将其写入到单独的fruit.txt文件中,此文件的格式和格式如下:

[["Peach",0,0,0], ["Banana",0,0,0], ["Apple",0,0,0], ["Pear",0,0,0], ["Mango",0,0,0], ["Orange",0,0,0], ["Apricot",0,0,0]]

当我在Python文件的开头执行此操作

with open("fruit.txt") as file: fruit = file.read()

它将fruit.txt中的数据正确分配给fruit var。当我print(fruit)时,它甚至看起来像预期的嵌套列表。

但是,当我查询fruit变量时,例如通过其他功能动态更改0的情况,或者当我尝试对嵌套列表进行排序,或者进行任何更改数据的操作时,它总是会返回各种错误。好像将fruit var设置为文件中的数据时,它不会将其识别为嵌套列表,而是将其识别为字符串。因此,我无法在该列表上进行操作。

但是,如果我这样做:

with open("fruit.txt") as file: fruit_count = file.read() fruit = eval(fruit_count)

然后fruit var表现良好-值会更新,并将其写回到文件中以备将来使用等。

我知道eval从理论上讲是邪恶的(或者至少在大多数情况下应该避免),除非您信任数据源(在这种情况下我会这样做)。但是我只是想知道是否还有其他解决方案?

理想情况下,我不想使用任何其他模块,例如ast.literal_eval

1 个答案:

答案 0 :(得分:1)

这可能并不理想,但是下面是使用json模块的方法(即使您不想使用其他模块):

import json
from pprint import pprint

lists = [["Peach",0,0,0], ["Banana",0,0,0], ["Apple",0,0,0], ["Pear",0,0,0],
         ["Mango",0,0,0], ["Orange",0,0,0], ["Apricot",0,0,0]]

with open("fruits.json", "w") as fp:
    json.dump(lists, fp)

with open("fruits.json", "r") as fp:
    fruits = json.load(fp)

pprint(fruits)

输出:

[['Peach', 0, 0, 0],
 ['Banana', 0, 0, 0],
 ['Apple', 0, 0, 0],
 ['Pear', 0, 0, 0],
 ['Mango', 0, 0, 0],
 ['Orange', 0, 0, 0],
 ['Apricot', 0, 0, 0]]

请注意,回读的数据确实有正确的数据类型。