如何序列化和反序列化打开的文件对象?
有没有办法把一个打开的文件对象进行序列化和反序列化,这样反序列化出来的对象就和序列化前的对象有一样的特性,比如完整路径、打开模式、偏移量、内部缓冲区等等?
从代码的角度来看,大概是这样的:
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)。唯一的办法是序列化文件的路径、模式和字节偏移量,然后在反序列化时重新打开文件并移动到正确的位置。
总之,我觉得序列化文件并不是个好主意,因为文件可能会被删除,这样反序列化就会失败。最好是只序列化文件的内容。