Невозможно загрузить список классов с помощью функции pickle в Python 3.7 - PullRequest
0 голосов
/ 20 октября 2018

У меня есть сценарий, который я написал, который хранит экземпляры классов расходов и доходов в списках.

При первом запуске модуля я использую блок try / Кроме того, чтобы проверить наличие маринованного файла:

try:
        #list definitions
        expenselist = pickle.load(open(filename,'rb'))
        incomelist = pickle.load(open(filename,'rb'))
except:
        print ("Generating new lists.")
        #list definitions
        expenselist = []
        incomelist = []

Работает так, как задумано, при запуске в режиме IDLE: test-slide-1

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

enterValue = str(input("Hi, press 1 to enter income and 2 to expense"))

    try:
        if enterValue == '1':
            addIncome ()
            #printRev()#debug to print class
        elif enterValue == '2':
            addExpense ()
            #printExp() #debug to print class
        else:
            raise ValueError 
    except ValueError:
        print ("Incorrect Value.")

Этот результат приводит к IDLE: test-slide-2

Затем он маринован с использованием:

#pickle expenselist
pickle.dump(expenselist,open(filename,'wb'))

#pickle incomelist
pickle.dump(incomelist,open(filename,'wb'))

Маринованныйданные хранятся здесь: file_structure

Когда я открываю этот файл с помощью Notepad ++, я получаю это:

€] q.

Итак, я знаю эточто-то сохранил.

Все до сих пор шло в соответствии с дизайном, но когда я снова запускаю скрипт, я получаю: test-slide-3

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

Я уже несколько недель пытаюсь понять, что происходит.Первоначально я думал, что это сохранение местоположения экземпляра класса, а не самого экземпляра, но он должен напечатать адрес экземпляра, если это так.Вместо этого я получаю пустые списки.

Мои вопросы: 1, генерирует ли он новые списки независимо от загрузки рассола и как мне его остановить?и 2, если это не проблема, то что?

Я на 50% самоучка, и я исчерпал ресурсы, о которых знаю.У меня было два программиста взглянуть на код, но ни один из них не является экспертом Python.Так что это единственное, что я не пробовал.

1 Ответ

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

Рассол очень прост в использовании.Я рекомендую использовать оператор with и, как в комментарии @John Anderson, похоже, вы перезаписываете файл.

Пример использования:

import pickle

a = [1,2,3]
b = [4,5,6]
with open("pickle1.dat", 'wb') as f:
    pickle.dump(a, f)
    pickle.dump(b, f)

c = None
d = None
with open("pickle1.dat", 'rb') as f:
    c = pickle.load(f)
    d = pickle.load(f)

print(c)
print(d)

Выходы

[1,2,3]
[4,5,6]
...