Python 如何将任何对象转换为字节数组并将其保留在内存中?
我正在尝试为Python中的任何对象到字节数组构建一个简单的转换器。我看了一下pickle,但它只能创建一个文件,这不是我需要的。我还检查了json.dump,但有些对象需要一个序列化程序来转储 我需要一个转换器,它可以将我的对象保存在内存中,并可以将任何对象转换为字节数组。Pickler的file参数只需要有一个writeb方法来接收字节。原则上,您可以使用方法writeself编写自己的类,b使用这些比特执行任何操作,并将该类的对象传递给Pickler 例如:Python 如何将任何对象转换为字节数组并将其保留在内存中?,python,arrays,byte,data-conversion,Python,Arrays,Byte,Data Conversion,我正在尝试为Python中的任何对象到字节数组构建一个简单的转换器。我看了一下pickle,但它只能创建一个文件,这不是我需要的。我还检查了json.dump,但有些对象需要一个序列化程序来转储 我需要一个转换器,它可以将我的对象保存在内存中,并可以将任何对象转换为字节数组。Pickler的file参数只需要有一个writeb方法来接收字节。原则上,您可以使用方法writeself编写自己的类,b使用这些比特执行任何操作,并将该类的对象传递给Pickler 例如: import pickle
import pickle
class File:
def write(self,b):
print(b)
f = File()
p = pickle.Pickler(f)
object = 3.14
p.dump(object)
输出:b'\x80\x03G@\t\x1e\xb8Q\xeb\x85\x1f'
不必像本例中那样打印字节,您可以将它们附加到列表中,或任何您想要的内容。Pickler的file参数只需要有一个writeb方法来接收字节。原则上,您可以使用方法writeself编写自己的类,b使用这些比特执行任何操作,并将该类的对象传递给Pickler
例如:
import pickle
class File:
def write(self,b):
print(b)
f = File()
p = pickle.Pickler(f)
object = 3.14
p.dump(object)
输出:b'\x80\x03G@\t\x1e\xb8Q\xeb\x85\x1f'
不必像本例中那样打印字节,您可以将它们附加到列表中,或者附加到任何您想要的内容中。我将此添加为实际答案,因为它似乎可以满足您的需要。使用pickle.dump是一个问题,因为它的设计目的是获取序列化对象并将其写入文件,尽管正如其他答案中所指出的,它不一定非得这样做,但这与问题无关 要使用的函数是,它直接以字节数组的形式返回序列化对象: someobject=123 字节=pickle.dumpssomeobject
我将此添加为实际答案,因为它似乎满足了您的需求。使用pickle.dump是一个问题,因为它的设计目的是获取序列化对象并将其写入文件,尽管正如其他答案中所指出的,它不一定非得这样做,但这与问题无关 要使用的函数是,它直接以字节数组的形式返回序列化对象: someobject=123 字节=pickle.dumpssomeobject
你看过这个函数了吗?是的,看起来bytearray只把字符串转换成bytearray。你有没有一个例子,我可以将任何类型的对象转换为byte array@Abion47?任意类型,不问任何问题?不,我认为如果没有认真的反思工作,这是不可能的,即使这样,也可能会带来更多的麻烦。如果你想序列化一个类型,特别是自定义类型,你通常必须定义如何序列化它,例如,通过遵循,这样你就可以用bytearray对它进行序列化。但是,说到pickle,你为什么认为它只能通过将它写入文件来工作?您是否尝试过dumps函数?@R.Karlus您可以使用pickle.dumps,但为什么需要将其转换为字节?目的是什么?您看过函数了吗?是的,看起来bytearray只将字符串转换为bytearray。你有没有一个例子,我可以将任何类型的对象转换为byte array@Abion47?任意类型,不问任何问题?不,我认为如果没有认真的反思工作,这是不可能的,即使这样,也可能会带来更多的麻烦。如果你想序列化一个类型,特别是自定义类型,你通常必须定义如何序列化它,例如,通过遵循,这样你就可以用bytearray对它进行序列化。但是,说到pickle,你为什么认为它只能通过将它写入文件来工作?您是否尝试过dumps函数?@R.Karlus您可以使用pickle.dumps,但为什么需要将其转换为字节?目的是什么?这是一个很大的工作,使转储工作时,你可以只使用转储。我解决了问题,使用酸洗转储方法。但这是我对帮助的支持。@Abion47这不是“使转储工作”,而是表明它在使用时不必是文件。传递值的两种形式,作为返回值或回调,都有其各自的情况,其中一种形式比另一种更可取。当然,您可以将dump用于非文件对象的对象。但是您必须定义一个自定义类,该类依附于一个特定接口,该接口定义一个函数,该函数将字节作为参数接收。或您可以跳过所有这些,直接使用转储获取字节。你的答案是一个有趣的factoid,但我想不出在什么情况下,它实际上是OP的一个有用的替代解决方案。@Abion47应该有很多在线帖子,当使用回调而不是返回值更方便时,你可以从中学习。这是一个。我能想到一些:序列化不适合内存,你想用它做点什么,比如将它与另一个进行比较。当你可以只使用转储时,要使转储工作起来需要做很多工作。我使用pickle dumps方法解决了这个问题。但这是我对帮助的支持票。@Abion47这不是“让人倾倒”
“工作”,但要表明它在使用时不必是文件。传递值的两种形式,作为返回值或回调,都有其各自的情况,其中一种形式比另一种更可取。当然,您可以将dump用于非文件对象的对象。但是您必须定义一个自定义类,该类依附于一个特定接口,该接口定义一个函数,该函数将字节作为参数接收。或您可以跳过所有这些,直接使用转储获取字节。你的答案是一个有趣的factoid,但我想不出在什么情况下,它实际上是OP的一个有用的替代解决方案。@Abion47应该有很多在线帖子,当使用回调而不是返回值更方便时,你可以从中学习。这是一个。我能想到一些:序列化不适合内存,你想用它做点什么,比如把它和另一个进行比较。太棒了!好极了投票通过了,太棒了!好极了投票通过。