Как загрузить вложенный список из файла без кавычек?

Я должен создать систему «управления складскими запасами» для оптового продавца программного обеспечения по заданию модуля. Я создал программу, но у меня проблемы с постоянным сохранением данных. Программа состоит из вложенных списков, подобных следующим:

[["Ms Office", "CD", 7, "Microsoft"], ["Acrobat Reader", "DVD", 12, "Adobe"], ["Norton Antivirus", "DVD", 24, "Symantec"]]

Я могу сохранить их в текстовый документ в формате

['Ms Office', 'CD', 7, 'Microsoft']
['Acrobat Reader', 'DVD', 12, 'Adobe']
['Norton Antivirus', 'DVD', 24, 'Symantec']

Но когда я пытаюсь загрузить его обратно в виде списка в том же формате, я получаю кавычки, разделяющие каждую запись, например:

["['Ms Office', 'CD', 7, 'Microsoft']", "['Acrobat Reader', 'DVD', 12, 'Adobe']", "['Norton Antivirus', 'DVD', 24, 'Symantec']"]

Мне просто нужно избавиться от двойных кавычек, окружающих каждый элемент в списке. Код, который я использую для загрузки этого файла:

filename = open('Appexstock.txt', 'r')
contents = filename.read()
thelist = [name for name in contents.split('\n') if name.split('"') if name]
filename.close()

Я часами искал в Интернете и перепробовал все, но до сих пор не могу найти способ заставить это работать. Я видел, как многие люди предлагают модуль CSV, но я понятия не имею, как применить его к моему коду.


person user2802349    schedule 21.09.2013    source источник


Ответы (1)


Используйте 1_:

>>> from ast import literal_eval
with open('Appexstock.txt') as f:
    lis = [literal_eval(line) for line in f]
...     
>>> lis
[['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']]

Для хранения объекта Python лучше использовать модуль pickle:

>>> import pickle
>>> data = [["Ms Office", "CD", 7, "Microsoft"], ["Acrobat Reader", "DVD", 12, "Adobe"], ["Norton Antivirus", "DVD", 24, "Symantec"]]
with open('my_data', 'w') as f:
    pickle.dump(data, f)
...     
with open('my_data') as f:
    print pickle.load(f)
...     
[['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']]
person Ashwini Chaudhary    schedule 21.09.2013
comment
Мне нужно сохранить список, загруженный из файла, в переменную списка, которую можно использовать в последующих функциях. как thelist = [['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']] когда я пытаюсь сделать это с помощью кода pickle, я получаю сообщение об ошибке: thelist = pickle.load(f) TypeError: 'str' не поддерживает интерфейс буфера. Я не знаю, делаю ли я это правильно. Я новичок в python и кодировании вообще - person user2802349; 21.09.2013
comment
@user2802349 user2802349 Я уже делаю это в первом коде, во втором просто сделайте: lis = pickle.load(data, f). - person Ashwini Chaudhary; 21.09.2013
comment
@user2802349 user2802349 Что такое f в вашем коде? (f должен быть файловым объектом) У меня это работает нормально. - person Ashwini Chaudhary; 21.09.2013
comment
ХОРОШО. Я не уверен, что случилось. Моя функция для сохранения списка: def savelists(): data = thelist with open('my_data', 'w') as f: pickle.dump(data, f) Мой код для загрузки данных: import pickle с open('my_data ') as f: thelist = pickle.load(data, f) print(thelist) Должен ли я сделать "данные" глобальной переменной? - person user2802349; 21.09.2013
comment
@user2802349 user2802349 Не вставляйте код в комментарии, он не читаем. Используйте ideone.com. - person Ashwini Chaudhary; 21.09.2013
comment
@user2802349 user2802349 Вам просто нужно: pickle.load(f), не передавайте data в load. - person Ashwini Chaudhary; 21.09.2013
comment
@ user2802349 Использование: thelist = pickle.load(f) - person Ashwini Chaudhary; 21.09.2013
comment
Я изменил его на это. Теперь он говорит, что thelist = pickle.load(f) TypeError: 'str' не поддерживает интерфейс буфера - person user2802349; 21.09.2013
comment
@user2802349 user2802349 Понятия не имею, что вы делаете, это отлично работает в моей системе: pastebin.com/iBbMcyE4 - person Ashwini Chaudhary; 21.09.2013
comment
Что-то не так, я думаю. Даже используя только часть кода, который вы только что отправили для проверки, я получаю сообщение об ошибке pickle.dump(data, f) TypeError: must be str, not bytes - person user2802349; 21.09.2013
comment
@ user2802349 Вы используете py3.x? - person Ashwini Chaudhary; 21.09.2013
comment
python 3.3.2 :( Работал над этой частью в течение нескольких дней. Есть ли способ загрузить текстовый файл в начале без кавычек? Как и без импорта каких-либо модулей? - person user2802349; 21.09.2013
comment
@ user2802349 открыть файл в двоичном режиме: open('my_data', 'wb') и ` open('my_data', 'rb') - person Ashwini Chaudhary; 21.09.2013
comment
@user2802349 user2802349 Нет необходимости изобретать велосипед, если стандартный модуль уже доступен, используйте его. :) - person Ashwini Chaudhary; 21.09.2013
comment
Появляется такое же сообщение об ошибке: thelist = pickle.load(f) TypeError: 'str' не поддерживает интерфейс буфера. Весь смысл этой программы в том, чтобы создать систему управления запасами для оптового продавца программного обеспечения. У меня есть вся программа. Около 250 строк кода. Все, чему мы научились на уроке. Мы также научились сохранять базовые вещи в текстовые файлы. Но у меня есть вложенные списки в моей программе, которые должны оставаться измененными (если вносятся изменения), когда программа закрывается и загружается, чтобы использоваться в функциях, когда программа снова открывается. Это был единственный способ, который я мог придумать, чтобы сделать это. - person user2802349; 21.09.2013
comment
Большое спасибо за вашу помощь, хотя :) Многое значило :) - person user2802349; 21.09.2013