Python删除临时文件错误 - 仍在使用中

时间:2012-06-27 16:51:30

标签: python temporary-files

所以,我正在创建一堆临时文件来备份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应该返回的文件句柄的建议......但我没有运气。当我在调试器中查看它时,我只看到一个整数和文件路径。

UPDATE!我想我修复了它:我只需要在filepath [0]上调用os.close,看起来它已经关闭了!感谢大家!这是更新的代码

再次感谢。

3 个答案:

答案 0 :(得分:6)

很抱歉,如果这是显而易见的事情,但只是检查一下,当你完成这些文件之后,你 关闭 文件,然后再尝试删除它们吗?

  

mkstemp()

     

“将包含操作系统级句柄的元组返回给打开的文件(如   将由os.open())及其绝对路径名返回   文件,按顺序“

Python doc source for above

因此,在尝试删除文件句柄之前,我会尝试对close()进行调用。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

要以原子方式重命名文件,您可以使用os.rename()。 <{1}}可能会在shutil.move()失败时起作用,但它不是原子的。