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

Python删除临时文件错误--仍在使用中,python,temporary-files,Python,Temporary Files,因此,我正在用python备份一些google文档,创建一组临时文件。我已经制作了这些文件的适当副本os.copy。现在我准备删除它们。我是这样创造的: line = entry.id.text title = entry.title.text splitLine = line.split('/') key = splitLine[-1] backUpDir = R'\\XXX\XXXXX\XXXX\XXXXX\otherFiles\GoogleDocBackUp' + '\\'

因此,我正在用python备份一些google文档,创建一组临时文件。我已经制作了这些文件的适当副本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,它看起来好像已经关闭了!谢谢大家!这是更新后的代码


再次感谢。

如果这是明显的问题,很抱歉,但请检查一下,在删除文件之前,您正在关闭文件,对吗

mkstemp()

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

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

您可以使用来移动文件。

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

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


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

不用担心明显性--我真的可以关闭这些临时文件吗?我从来没有明确地说f.open…但如果我能…一定要说!嗯……使用我的调试器,我只看到一个整数和文件路径。我将在我的原始问题中发布更多代码。明白了!谢谢你的帮助!如果没有你,我不会发现这一点。干杯。@Mizmor很高兴能帮上忙