Внешний файл со смешанным форматом списка, используя eval - PullRequest
0 голосов
/ 06 октября 2018

Я читаю, обновляю и записываю следующую отдельную строку данных в отдельный файл 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 var, например, динамическое изменение 0 с помощью других функций или когда я пытаюсьсортировать вложенный список или делать что-либо для изменения данных, он всегда возвращает различные ошибки.Как будто, когда он устанавливает переменную fruit для данных из файла, он не распознает его как вложенный список, а скорее как строку.Поэтому я не могу работать с этим списком.

Если, однако, я делаю:

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

Тогда fruit var ведет себя нормально - значения обновляются, и этопишет обратно в файл, готовый для дальнейшего использования и т. д.

Я понимаю, eval теоретически является злом (или, по крайней мере, его следует избегать в большинстве случаев), если вы не доверяете источнику данных (что я и делаю в этом случае),Но мне просто интересно, есть ли другое решение?

В идеале я не хочу использовать какие-либо дополнительные модули, например ast.literal_eval

1 Ответ

0 голосов
/ 06 октября 2018

Возможно, это не идеально, но вот как это сделать с модулем 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]]

Обратите внимание, что при считывании данных действительно содержит правильные типы данных.

...