Взаимодействие с несколькими словарями в файле Pickle

Я должен использовать рассол для хранения некоторых данных. Я создал класс для обработки ввода-вывода данных, одна функция отвечает за загрузку данных и печать всей информации, но когда я вызываю функцию для распечатки данных, она взаимодействует только с первым словарем. . Все входные данные сохраняются (поскольку я открыл файл рассола и мог видеть некоторые данные, связанные с другими входными данными).

Я проверил некоторые из вопросов, связанных со стеком, например: Перебор словарей с использованием циклов for и Лучший способ перебора нескольких словарей в Python но ни один из примеров не дал ожидаемого результата.

Это класс DataBase, который отвечает за обработку рассола:


import pickle
from pathlib import Path

class DataBase:
    def __init__(self, out_file):
        self.out_file = out_file

    def Create(self, file_name):
        if not Path(self.out_file).exists():
            with open(self.out_file, "w+b") as this_file:
                new_file = pickle.dump(file_name, this_file, pickle.HIGHEST_PROTOCOL)
        elif Path(self.out_file).exists():
            self.Update(file_name)
        else:
            print("Unknown error!")

    def Update(self, file_name):
        with open(self.out_file, "a+b") as this_file:
            updated_file = pickle.dump(file_name, this_file, pickle.HIGHEST_PROTOCOL)

    def Load(self):
        with open(self.out_file, "rb") as this_file:
            loaded_file = pickle.load(this_file)
            return loaded_file

    def PrintFile(self):
        for k, v in self.Load().items():
            print(f"{k} {v}")

Это код, который я написал для тестирования класса:

from DataBase import DataBase as DB

dict0 = {1:'A', 2:'E', 3:'I', 4:'O', 5:'U'}
dict1 = {0:"Water", 1:"Fire", 2:"Air", 3:"Sand"}
db = DB("test")
db.Create(dict0)
db.Create(dict1)
db.PrintFile()

Я ожидал, что вывод будет:

1 A
2 E
3 I
4 O
5 U
0 Water
1 Fire
2 Air
3 Sand

Однако вывод, который я получаю:

1 A 
2 E
3 I 
4 O 
5 U

Вся информация сохраняется, когда я открываю файл рассола с помощью текстового редактора, я вижу некоторую информацию, хранящуюся там:

��#}�(K�A�K�E�K�I�K�O�K�U�u.��)}�(K�Water�K�Fire�K�Air�K�Sand�u
Мы видим, например, Air в файле.

What can I do to have the expected output?


person Lokian    schedule 29.05.2019    source источник


Ответы (2)


Вы можете запускать pickle.load() для одного и того же файла несколько раз.

Как это:

import pickle
from pathlib import Path


class DataBase:
    def __init__(self, out_file):
        self.out_file = out_file

    def Create(self, file_name):
        if not Path(self.out_file).exists():
            with open(self.out_file, "w+b") as this_file:
                new_file = pickle.dump(file_name, this_file, pickle.HIGHEST_PROTOCOL)
        elif Path(self.out_file).exists():
            self.Update(file_name)
        else:
            print("Unknown error!")

    def Update(self, file_name):
        with open(self.out_file, "a+b") as this_file:
            updated_file = pickle.dump(file_name, this_file, pickle.HIGHEST_PROTOCOL)

    def Load(self):
        with open(self.out_file, "rb") as this_file:
            loaded_file = pickle.load(this_file)
            loaded_file2 = pickle.load(this_file)
            return [loaded_file, loaded_file2]

    def PrintFile(self):
        for i in self.Load():
            for k, v in i.items():
                print(f"{k} {v}")


if __name__ == '__main__':
    # from DataBase import DataBase as DB
    dict0 = {1: 'A', 2: 'E', 3: 'I', 4:'O', 5: 'U'}
    dict1 = {0: "Water", 1: "Fire", 2: "Air", 3: "Sand"}
    db = DataBase("test")
    db.Create(dict0)
    db.Create(dict1)
    db.PrintFile()

Дает следующий вывод:

1 A
2 E
3 I
4 O
5 U
0 Water
1 Fire
2 Air
3 Sand
person Jimmy Engelbrecht    schedule 29.05.2019
comment
Лучше преобразовать функцию для использования циклов while, чтобы она могла возвращать все замаринованные объекты. - person Rahul; 29.05.2019
comment
конечно, я думал, что это само собой разумеющееся, что я оставил эту задачу читателю. - person Jimmy Engelbrecht; 29.05.2019
comment
@JimmyEngelbrecht спасибо за ответ, я адаптирую ваш пример для проекта. - person Lokian; 29.05.2019
comment
@Rahul, ты имеешь в виду функцию Load ()? - person Lokian; 29.05.2019
comment
@Lokian, да, функция Load(), я уже исправил PrintFile() для перебора всего списка объектов. - person Jimmy Engelbrecht; 29.05.2019

Вы можете попробовать объединить два словаря, прежде чем их рассолить, но это может быть не то, что вам нужно для вашего конкретного приложения. Я предполагаю, что часть .load словаря db.printfile() не загружает оба словаря и поэтому печатает/возвращает только первый.

person Arnav Poddar    schedule 29.05.2019
comment
В том то и дело, что я не могу совместить, потому что в проекте у меня будет класс для хранения таких данных, как имя, идентификатор, возраст. Я попытался адаптировать некоторые примеры, которые профессор показал во время занятия, но этот, который я создал, был лучшим подходом для моей ситуации. Как я могу заставить db.PrintFile() загружать словари borth? - person Lokian; 29.05.2019
comment
Извините, тогда не знаю, чем вам помочь. Удачи - person Arnav Poddar; 29.05.2019