【问题标题】:Python Delete temporary file error--Still in usePython删除临时文件错误--仍在使用
【发布时间】:2012-06-27 16:51:30
【问题描述】:

所以,我通过在 python 中备份一些谷歌文档来创建一堆临时文件。我已经制作了这些文件 os.copy 的适当副本。现在我准备删除它们。我是这样创建它们的:

    line = entry.id.text
title = entry.title.text
splitLine = line.split('/')
key = splitLine[-1]

backUpDir = R'\\XXX\XXXXX\XXXX\XXXXX\otherFiles\GoogleDocBackUp' + '\\'


today = datetime.date.today()
if not os.path.exists(backUpDir + str(today)):
  os.mkdir(backUpDir + str(today))

backupDir = backUpDir + str(today)

tempfile.tempdir = backupDir
file_path = tempfile.mkstemp(suffix='.xls')    

uri = 'http://docs.google.com/feeds/documents/private/full/%s' % key

spreadsheets_client = gdata.spreadsheet.service.SpreadsheetsService()
spreadsheets_client.email = self.gd_client.email
spreadsheets_client.password = self.gd_client.password
spreadsheets_client.source = "My Fancy Spreadsheet Downloader"
spreadsheets_client.ProgrammaticLogin()


# ...
docEntry = self.gd_client.GetDocumentListEntry(uri)

docs_auth_token = self.gd_client.GetClientLoginToken()
self.gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken())
self.gd_client.Export(docEntry, file_path[1])
shutil.copy(file_path[1], backupDir + '//' + title + '.xls')

self.gd_client.SetClientLoginToken(docs_auth_token)  

os.close(file_path[0])

我曾考虑创建一个 tempfile.Temporary 文件而不是 mkstemp,但我遇到了权限错误。 (我怀疑临时文件也试图删除我给它的目录)

所以回到问题的本质。我尝试在这些临时文件上使用 os.remove,python 不会放弃对它的控制。 (我知道我的 os.remove 代码有效,因为我在一些剩余的临时文件上运行了该函数,并且它们被删除而没有问题。)

我会喜欢这里的——如果我可以删除临时文件——太好了。如果我不能,是否可以在 python 中重命名文件?

到目前为止,我已经得到了一些关于获取 mkstemp 应该返回的文件句柄的建议......但我没有任何运气。当我在调试器中查看时,我只看到一个整数和文件路径。

更新!我想我修复了它:我只需要在文件路径 [0] 上调用 os.close ,它看起来就像关闭了!谢谢大家!这是更新的代码

再次感谢。

【问题讨论】:

    标签: python temporary-files


    【解决方案1】:

    对不起,如果这是显而易见的事情,但只是检查一下,您在尝试删除文件之前关闭文件,对吗?

    mkstemp()

    "返回一个元组,其中包含一个打开文件的操作系统级句柄(如 将由os.open()) 和该绝对路径名返回 文件,按这个顺序”

    Python doc source for above

    所以我会在尝试删除文件句柄之前尝试close() 调用。

    【讨论】:

    • 不用担心显而易见——我真的可以关闭这些临时文件吗?我从来没有明确说过 f.open...但如果我可以...告诉!
    • 嗯....使用我的调试器,我只看到一个整数和文件路径。我将在我原来的问题中发布更多代码。
    • 知道了!谢谢你的帮助!没有你,我不会发现。干杯。
    • @Mizmor 很高兴能够提供帮助
    【解决方案2】:

    您可以使用shutil.move() 移动文件。

    【讨论】:

      【解决方案3】:

      mkstemp() 返回 fd 和路径。 os.remove() 接受路径,而不是元组。在删除之前关闭文件 (os.close(fd))。

      您应该可以在没有权限问题的情况下使用tempfile.TemporaryFile()

      要自动重命名文件,您可以使用os.rename()shutil.move() 可能会在 os.rename() 失败但它不是原子时起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多