4

そのため、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])

mkstemp の代わりに tempfile.Temporary ファイルを作成することを検討しましたが、権限エラーが発生していました。(一時ファイルが、指定したディレクトリも削除しようとしたと思われます)

では、問題の本質に戻りましょう。これらの一時ファイルで os.remove を使用しようとしましたが、python はその保持を放棄しません。(私は os.remove コードが機能することを知っています。これは、残りの一時ファイルのいくつかに対してその関数を実行し、それらが問題なく削除されたためです。)

一時ファイルを削除できれば、ここにいくつかあればいいのですが。できない場合は、Python でファイルの名前を変更する方法はありますか?

これまでのところ、mkstemp が返す必要があるファイル ハンドルを取得する方法についていくつか提案を受けましたが、うまくいきません。デバッガーで見ると、整数とファイル パスしか表示されません。

アップデート!私はそれを修正したと思います: filepath[0] で os.close を呼び出すだけで、閉じたように見えます! みんな、ありがとう!ここに更新されたコードがあります

再度、感謝します。

4

3 に答える 3

6

これが明白なことである場合は申し訳ありませんが、確認するだけです。ファイルを削除する前に、ファイルを閉じているのですか?

mkstemp()

「開いているファイルへの OS レベルのハンドルを含むタプルを返します (os.open())そのファイルの絶対パス名がこの順序で返されるように」

上記の Python doc ソース

したがってclose()、ファイルハンドルを削除する前に、ファイルハンドルの呼び出しを試みます。

于 2012-06-27T16:55:41.470 に答える
0

shutil.move()を使用してファイルを移動できます。

于 2012-06-27T16:56:58.557 に答える
0

mkstemp() は、fd とパスの両方を返します。os.remove() は、タプルではなくパスを受け入れます。削除する前にファイルを閉じます ( os.close(fd))。

tempfile.TemporaryFile()許可の問題なく使用できるはずです。

ファイルの名前をアトミックに変更するには、os.rename(). 失敗したshutil.move()ときに機能する可能性がありますが、アトミックではありません。os.rename()

于 2012-06-27T16:58:03.517 に答える