gpt4 book ai didi

python - 在 Python 中序列化/反序列化类对象的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-05 08:10:55 28 4
gpt4 key购买 nike

我正在尝试从我正在使用的单元中记录一些数据,以进行长期和短期数据收集和存储。

我应该使用 json 库还是 pickle 库,然后如何从文件加载单位的数据、能够对其进行操作、添加单位等,然后将更新后的数据保存回文件?

这里详细解释了我的问题和我卡在哪里:

对于每个单元,我在类对象中都有一些数据:

unit_1.name = 'unit_1'
unit_1.folder = 'C:\\Users\\Thomas\\Documents\\1'
unit_1.serial_number = 1
unit_1.offsets = [0.00, 0.00, 0.00, 0.00 ...]
unit_1.status = 'Open'
etc

我想存储这些对象以进行长期存储(因此在文件中),但我还需要能够通过执行以下操作从命令行将它们作为类对象访问:

>python
Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

>from file import unit_log
>unit_log.load()
>unit_1.serial_number
1

我想创建这样的新单元:

>unit_2 = unit_log(2)

这将在类的 init 模块中创建其他字段。之后,我可以通过执行以下操作来保存我创建或修改的单元:

>unit_log.save()

它会将所有单位保存到文件中。这是该类的代码:

file.py

class unit_log:
def __init__ (self, serial_number):
self.serial_number = serial_number;
self.unit_name = 'unit_'+str(serial_number)
self.status = 'Open';
self.offsets = [];
self.folder = 'C:\\Users\\Thomas\\Documents\\' + str(serial_number)
@classmethod
def load (self):
#Something that loads the data
@classmethod
def save (self):
#Something that saves the data

我目前的理解是,我正在尝试做的事情称为序列化/反序列化,并且有几种不同的方法可以做到这一点(主要的方法是 pickle 库和 json 库)。

我的问题是:如何将 json 文件(或 pickle 文件)反序列化为一堆类对象?我假设 json 文件看起来像这样:

unit_logs.json
{
unit_1:{
{
"unit_name": "unit_1",
"serial_number": 1,
"status": "Open",
"offsets": [],
"folder": "C:\\Users\\Thomas\\Documents\\1"
}
unit_2...
unit_3...
...
}

我会使用 log = json.load(unit_logs.json) 加载文件。我想然后有一个

for unit in log:
unit["unit_name"] = unit_log(unit)

但这不是声明变量的方式。

我相信 pickle 库的工作方式类似,但我不太熟悉它。

我应该使用 json 库还是 pickle 库,然后如何从文件加载单位的数据、能够对其进行操作、添加单位等,然后将更新后的数据保存回文件?

最佳答案

pickle 库易于使用

转储对象 obj 到文件:

import pickle

with open(f_path, "wb") as f:
pickle.dump(obj, f)

加载 pickle 文件:

with open(f_path, "rb") as f:
obj = pickle.load(f)

然后你可以改变obj并再次写入文件

如果您想多次加载同一个 pickle 文件并且有不同的对象,您可以:

N=<number of copies>

with open(f_path, "rb") as f:
obj_list = [pickle.load(f) for _ in range(N)]

现在您可以分别编辑 obj_list 中的每个对象,如果您想将其状态保存到 pickle 文件中,您可以使用如上所述的 pickle.dump

因此您可以从中加载"template"pickle 文件,然后根据需要编辑对象。

关于python - 在 Python 中序列化/反序列化类对象的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68911331/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com