Как добавить новые данные в существующий файл .data с помощью pickle - PullRequest
0 голосов
/ 03 августа 2020

У меня есть файл .data, который я хочу обновить новыми данными

Вот мой python файл с именем pi c .py

import pickle
dataset = [['Foam', 'cake', 430], ['other', 'icecream', 50]]

# creating .data file for first time
outfile = open('database.data', 'wb')
pickle.dump(dataset, outfile)
outfile.close()

newdata = ['type','name','price']

with open('database.data','rb') as temp_data:
    temp_database = pickle.load(temp_data)

temp_database += newdata

with open('database.data','wb') as temp_data:
    pickle.dump(temp_database,temp_data)

теперь каждый раз, когда Мне нужно сначала добавить новые данные в свой .data. Я загружаю свой .data файл, используя pickle, в переменную temp_database, а затем добавляю свои новые данные к этой переменной. После этого я использовал метод pickle.dump () для экспорта всей моей базы данных, которая является "temp_database", в файл database.data

Моя проблема: >>> "Есть ли какой-нибудь короткий метод для добавления новых данных. файл данных с помощью pickle без чтения существующих данных -> добавить новые данные -> записать и выгрузить новые данные в существующий файл? "

1 Ответ

0 голосов
/ 03 августа 2020

Пока вы храните temp_database в памяти, нет необходимости каждый раз перезагружать содержимое database.data. После внесения некоторых изменений в temp_database вам нужно только записать его обратно в database.data и сохранить ссылку на temp_database где-нибудь, чтобы иметь возможность изменить его снова.

Например, что-то вроде:

import pickle

class DataAccess:
        
    def __init__(self, db_file_name, initial_data=None):
        self.db_file_name = db_file_name
        if initial_data:
            self.temp_database = initial_data
            self.safe_db()
        else:
            with open(self.db_file_name, "rb") as f:
                self.temp_database = pickle.load(f)
    
    def safe_db(self):
        with open(self.db_file_name, "w+b") as f:
            pickle.dump(self.temp_database, f)


# For initialisation with existing data:
# da = DataAccess("database.data", [['Foam', 'cake', 430], ['other', 'icecream', 50]])
da = DataAccess("database.data")

...

# And whenever you modify the database:
da.temp_database += ['some', 'changes']
da.safe_db()

...

da.temp_database += ['another', 'change']
da.safe_db()

Конечно, вы должны добавить правильную обработку ошибок.

Вы также можете посмотреть pickle.Pickler

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

...