如何序列化和反序列化打开的文件对象?

1 投票
1 回答
3289 浏览
提问于 2025-04-29 14:40

有没有办法把一个打开的文件对象进行序列化和反序列化,这样反序列化出来的对象就和序列化前的对象有一样的特性,比如完整路径、打开模式、偏移量、内部缓冲区等等?

从代码的角度来看,大概是这样的:

import some_pickle_like_module as splm

with open("infile.bin", "rb") as fp:
    first17bytes = fp.read(17)

    with open("infile.splm", "wb") as pkl:
        splm.dump(fp, pkl)

# and later in the code:

with open("infile.splm", "rb") as pkl:
    fp = splm.load(pkl)

next17bytes = fp.read(17)
fp.close()

需要注意的是,这个例子有点简单(因为我可以直接用dump()和load()来处理文件名和偏移量),但同样的道理也适用于压缩文件,在某个特定位置查找可能会非常慢。

暂无标签

1 个回答

-1

不,这个是不可能的。理由是:如果你关闭了文件描述符,就无法通过反序列化(unpickling)来重新获取之前的对象,除非你重新打开文件。文件对象是由操作系统内核定义的,Python无法控制这些,因此也不能对它们进行序列化(pickle)。唯一的办法是序列化文件的路径、模式和字节偏移量,然后在反序列化时重新打开文件并移动到正确的位置。

总之,我觉得序列化文件并不是个好主意,因为文件可能会被删除,这样反序列化就会失败。最好是只序列化文件的内容。

撰写回答