marshal - 内部Python对象序列化
序列化数据意味着将其转换为字节字符串,然后再从这样的字符串重构它。如果数据完全由基本的Python对象组成,序列化数据的最快方法是使用 marshal 模块(对于用户定义的类,应该首选 Pickle)。 Marshal 模块包含可以以二进制格式读取和写入Python值的函数。
marshal模块的存在主要是为了支持对 .pyc 文件的Python模块的“伪编译”代码的读写。此模块不支持所有Python对象类型。
支持以下类型:布尔值、整数、浮点数、复数、字符串、字节、字节数组、元组、列表、集合、冻结集、字典和代码对象,其中应理解元组、列表、集合、冻结集仅当其中包含的值本身得到支持时,才支持字典。单例 None、Ellipsis 和 StopIteration 也可以被编组和解组。
职能 :
- 元帅版本:
它指示模块使用的格式。- 版本 0 – 历史格式
- 版本 1 – 共享内部字符串
- 版本 2 – 对浮点数使用二进制格式
- 版本 3 – 支持对象实例化和递归
- 版本 4 – 当前版本
- marshal.dumps(值 [,版本]):
该函数返回将通过转储(值,文件)写入文件的字节对象。 version 参数指示转储应使用的数据格式。如果值具有(或包含具有)不受支持的类型的对象,则会引发 ValueError 异常。例子
Python3
# Python code to demonstrate serialization import marshal data = {12:'twelve', 'feep':list('ciao'), 1.23:4+5j, (1,2,3):u'wer'} bytes = marshal.dumps(data) print (bytes)
Python3
# Python code to demonstrate de-serialization import marshal data = {12:'twelve', 'feep':list('ciao'), 1.23:4+5j, (1,2,3):u'wer'} bytes = marshal.dumps(data) redata = marshal.loads(bytes) print (redata)
输出
{tfeep[tctitatog®Gáz®ó?y@@ittwelve(iiiuwer0}
- marshal.loads(字节):
此函数可以通过将类似字节的对象转换为值来重建数据。如果未找到值,则会引发 EOFError、ValueError 或 TypeError。例子
Python3
# Python code to demonstrate de-serialization import marshal data = {12:'twelve', 'feep':list('ciao'), 1.23:4+5j, (1,2,3):u'wer'} bytes = marshal.dumps(data) redata = marshal.loads(bytes) print (redata)
输出{12: 'twelve', 1.23: (4+5j), 'feep': ['c', 'i', 'a', 'o'], (1, 2, 3): u'wer'}
- marshal.dump(值,文件 [,版本]):
该函数用于在打开的可写二进制文件上写入支持的类型值。如果值的类型不受支持,则会引发 ValueError 异常。 - marshal.load(文件):
此函数从打开的可读二进制文件中读取一个值并将其返回。如果未读取任何值,则会引发 EOFError、ValueError 或 TypeError。