有没有简单的方法在shelve中使用python的临时文件(并确保其自我清理)?
简单来说,我想在我写的Python程序中实现一个无限大小的字典(更准确地说,是受硬盘限制而不是内存限制的字典)。看起来tempfile和shelve模块很适合这个需求,但我不知道怎么安全地把它们结合使用。我希望当shelve不再使用时,tempfile能被删除(或者至少保证在shelve不再用的时候被删除),但是我想到的唯一解决办法是使用tempfile.TemporaryFile()来打开一个文件句柄,从这个句柄获取文件名,然后用这个文件名来打开shelve,同时保留对文件句柄的引用,以防它被垃圾回收(这样文件就不会被删除),然后再给shelve加一个包装,来存储这个引用。有没有人能给出比这个复杂的方案更好的解决办法呢?
限制条件:只能使用标准的Python库,并且必须完全跨平台。
1 个回答
1
我建议从shelve.Shelf这个类继承,并重写它的关闭方法,这样可以在关闭时删除相关的文件。需要注意的是,根据你使用的具体dbm模块,可能会有多个文件和这个shelf有关。一个解决办法是创建一个临时目录,而不是临时文件,完成后把目录里的东西都删除。另一个办法是绑定到特定的dbm模块(比如bsddb或者dumbdbm),然后专门删除这些库创建的文件。
另外要注意的是,shelf的关闭方法在垃圾回收时也会被调用。你可能会遇到垃圾文件的唯一情况是解释器崩溃或者被强制关闭。