在线文档教程

marshal

marshal — Internal Python object serialization

该模块包含可以以二进制格式读取和写入Python值的函数。该格式是针对Python的,但与机器体系结构问题无关(例如,您可以将Python值写入PC上的文件,将文件传输到Sun,然后再读回到那里)。该格式的细节是故意没有记录的; 它可能会在Python版本之间改变(尽管它很少)。[1]

这不是一个通用的“持久性”模块。对于通过RPC调用的Python对象的一般持久性和传输,请参阅模块pickleshelve。该marshal模块主要用于支持读取和编写.pyc文件的Python模块的“伪编译”代码。因此,如果需要,Python维护者保留修改编组格式的权利,这些编码格式采用后向不兼容的方式。如果你正在序列化和反序列化Python对象,可以使用pickle模块 - 性能可比,版本独立性得到保证,并且pickle支持比marshal更广泛的对象。

警告

marshal模块并非旨在防止错误或恶意构建的数据。切勿解组从不受信任或未经身份验证的源收到的数据。

并非所有的Python对象都支持; 一般来说,只有对象的值独立于特定的Python调用才能被该模块写入和读取。支持以下类型:布尔值,整数,长整数,浮点数,复数,字符串,Unicode对象,元组,列表,集合,frozensets,字典和代码对象,其中应该理解元组,列表,集合frozensets和词典只有在其中包含的价值本身得到支持的情况下才受到支持; 并且递归列表,集合和字典不应该被写入(它们将导致无限循环)。在单身NoneEllipsis并且StopIteration还可以编组和解组。

警告

在C long int类型超过32位的机器上(例如DEC Alpha),可以创建比32位更长的纯Python整数。如果在C long int类型只有32位的机器上将这样一个整数编组并读回,则会返回一个Python长整型对象。虽然类型不同,但数值相同。(这种行为在Python 2.2中是新的,在早期版本中,除了最不重要的32位数据都丢失了,并且打印了警告消息。)

有读取/写入文件的功能以及对字符串进行操作的功能。

该模块定义了这些功能:

marshal.dump(value, file[, version])

在打开的文件上写入值。该值必须是受支持的类型。该文件必须是打开的文件对象,例如sys.stdout或由open()或返回os.popen()。它可能不是Windows上的TemporaryFile等封装器。它必须以二进制模式('wb''w+b')打开。

如果该值具有(或包含具有)不受支持类型的对象,ValueError则会引发异常 - 但垃圾数据也会写入该文件。该对象不会被正确地读回load()

版本2.4中的新增功能:version参数指示dump应使用的数据格式(请参见下文)。

marshal.load(file)

从打开的文件中读取一个值并返回。如果没有有效的读取值(例如,因为数据有不同的Python版本的不兼容元帅格式),提高EOFErrorValueErrorTypeError。该文件必须是以二进制模式('rb''r+b')打开的打开的文件对象。

注释

如果包含不受支持的类型的对象被编组dump()load()将替代None解组类型。

marshal.dumps(value[, version])

返回将被写入文件的字符串dump(value, file)。该值必须是受支持的类型。养ValueError异常,如果值具有(或包含具有的对象)不支持的类型。

版本2.4中的新增功能:version参数指示dumps应使用的数据格式(请参见下文)。

marshal.loads(string)

将字符串转换为值。如果没有找到有效的价值,提高EOFErrorValueErrorTypeError。字符串中的额外字符将被忽略。

另外,定义了以下常量:

marshal.version

指示模块使用的格式。版本0是历史版本,版本1(在Python 2.4中添加)共享实际字符串,版本2(在Python 2.5中添加)使用二进制格式作为浮点数。当前版本是2。

2.4版本中的新功能。

1这个模块的名称源于Modula-3(其他人)的设计师使用的一些术语,他们使用术语“编组”来以独立的形式运输数据。严格来说,“编组”意味着将一些数据从内部转换为外部形式(例如在RPC缓冲区中),而对于反向进程则为“解组”。