【问题标题】:How do you erase the 3 shelve files in python 3?你如何擦除python 3中的3个搁置文件?
【发布时间】:2011-02-11 08:15:40
【问题描述】:

我在http://code.google.com/p/filecache/ 处使用搁置编写了一些单元测试,python 2 完全保存了我在 shelve.open() 中指定的文件名,但在 python 3 中,我得到了 3 个不同的文件“bak”、“dat”和“dir”。所以在测试开始之前,我想删除这些文件,但我不知道我是否对它们的文件名或扩展名有任何保证。

如果我知道搁架的名称,我该如何擦除它?

【问题讨论】:

    标签: python python-3.x shelve


    【解决方案1】:

    您获得的扩展取决于所使用的数据库后端。 Python 2 和 Python 3 之间的默认设置可能不同,但也可能是您的环境中可用的数据库接口不同。

    所以不,你不能保证扩展,除非你使用特定的实现,即 BsdDbShelf 或 DbfilenameShelf。您可以在 tempfile 创建的临时目录中指定一个文件,然后删除 while 目录。

    【讨论】:

    • 有点奇怪,我可以通过编程方式创建一个架子,尽管我不能擦除一个架子(无需假设太多)。
    • @ubershmekel:是的,我想有一种方法可以做到这一点。
    • DbfilenameShelf 不保证文件名顺便说一句。我当前的架子应该以'.cache'结尾,所以我使用的解决方案是删除所有以'.cache'、'.cache.bak'、'.cache.dir'和'结尾的可能文件.cache.dat'。无论如何感谢您的帮助。
    • @ubershmekel:我很确定 DbfilenameShelf 使用的名称结尾是一组有限的文件名,因此您可以看到它们是有保证的。它不会创建名为“.gif”或“.uggabugga”的文件。 :)
    • 如果这些后缀有据可查,我会更喜欢它。由于临时目录的想法,我接受了该解决方案,我认为这是最稳定的解决方案。
    【解决方案2】:

    我使用搁置是因为 tempFile 和 dict[] 对象不能跨模块持久存在。正如您所发现的,调用 .clear() 不会清除持久对象磁盘上中的内容,退出后会留下一个填充的 r+w 文件磁盘。 (类似于use-after-free漏洞)您可以在使用完毕后删除搁置:

    import os
    import shelve
    
    shelve_name = 'shelve_name'
    shelve_contents = shelve.open(shelve_name, flag='c', protocol=None, writeback=False)
    
    shelve_file = (os.path.join(os.getcwd(), shelve_name))
    os.remove(shelve_file)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多