Ошибка удаления временного файла Python — все еще используется

Итак, я создаю кучу временных файлов из резервных копий некоторых документов Google в 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 ДОЛЖЕН вернуть... но мне не повезло. Когда я смотрю на него в отладчике, я вижу только целое число и путь к файлу.

ОБНОВИТЬ! Я думаю, что исправил это: мне просто нужно было вызвать os.close на пути к файлу [0], и похоже, что он закрылся! Всем спасибо! Вот обновленный код

Спасибо еще раз.


person Mizmor    schedule 27.06.2012    source источник


Ответы (3)


Извините, если это что-то очевидное, но просто проверьте, вы закрываете файлы, когда закончите с ними, прежде чем пытаться их удалить, верно?

mkstemp()

«возвращает кортеж, содержащий дескриптор уровня ОС для открытого файла (который будет возвращен os.open()) и абсолютным путем к этому файлу в указанном порядке»

источник документа Python для приведенного выше

Поэтому я бы попробовал вызов close() для вашего дескриптора файла, прежде чем пытаться его удалить.

person Levon    schedule 27.06.2012
comment
Не беспокойтесь об очевидности — могу ли я закрыть эти временные файлы? Я никогда прямо не говорю f.open... но если я могу... скажите! - person Mizmor; 27.06.2012
comment
Хм... используя отладчик, я вижу только целое число и путь к файлу. Я опубликую еще немного кода в своем исходном вопросе. - person Mizmor; 27.06.2012
comment
Понятно! Спасибо за вашу помощь! Без тебя я бы этого не нашел. Ваше здоровье. - person Mizmor; 27.06.2012
comment
@Mizmor Рад, что смог помочь - person Levon; 27.06.2012

Вы можете использовать shutil.move() для перемещения файла.

person Brendan Long    schedule 27.06.2012

mkstemp() возвращает и fd, и путь. os.remove() принимает путь, а не кортеж. Закройте файл перед его удалением (os.close(fd)).

Вы должны иметь возможность использовать tempfile.TemporaryFile() без проблем с разрешением.

Чтобы переименовать файл атомарно, вы можете использовать os.rename(). shutil.move() может работать, когда os.rename() терпит неудачу, но это не атомарно.

person jfs    schedule 27.06.2012