【问题标题】:How to append new data in an existing .data file using pickle如何使用 pickle 在现有的 .data 文件中追加新数据
【发布时间】:2020-11-23 03:53:15
【问题描述】:

我有一个 .data 文件,我想用新数据更新它

这是我的名为 pic.py 的 python 文件

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 中附加新数据时,我都会使用 pickle 将 .data 文件加载到 temp_database 变量,然后将我的 newdata 附加到该变量。 之后,我使用 pickle.dump() 方法将“temp_database”的所有数据库导出到 database.data 文件

我的问题 :>>> “有没有什么简短的方法可以使用 pickle 在 .data 文件中追加新数据而不读取现有数据 -> 追加新数据 -> 将新数据写入并将新数据转储到现有文件中?”

【问题讨论】:

标签: python-3.x pickle


【解决方案1】:

只要将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。

【讨论】:

  • 感谢您的宝贵回答,但此方法也在做同样的事情,首先我们将数据库的副本初始化为 f(如您的代码 > self.temp_database = pickle.load(f)),在 temp_database“f”中进行一些更改后,我们“!!覆盖!!”我们现有的数据库,pickle.dump 成为我们最终的 self_db
  • 有没有像 append as in lists 这样的方法来扩展我们的 .data 文件,而无需总是复制-编辑-重写整个文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 2013-06-19
  • 2012-07-24
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多