mkstemp
возвращает уже открытый дескриптор файла fd
, за которым следует имя файла. Вы игнорируете файловый дескриптор (ваш выбор имени _
предполагает, что вы явно решили игнорировать его), и в результате вы игнорируете его закрытие. Вместо этого вы открываете файл второй раз, используя имя файла, создавая объект файла, который содержит дескриптор файла second для того же файла. Независимо от того, закрыли ли вы второй, первый остается открытым.
Вот исправление подхода mkstemp
:
temporaryFiles = []
for i in range(1000):
...
fd, name = tempfile.mkstemp()
os.write(fd, ... )
os.close(fd)
temporaryFiles.append(name) # remember the filename for future processing/deletion
Основываясь на предложении Уирмвуда в комментариях, еще лучший подход будет:
temporaryFiles = []
for i in range(1000):
...
with tempfile.NamedTemporaryFile(delete=False) as tmp:
# tmp is a context manager that will automatically close the file when you exit this clause
tmp.file.write( ... )
temporaryFiles.append(tmp.name) # remember the filename for future processing/deletion
Обратите внимание, что как mkstemp
, так и конструктор NamedTemporaryFile
имеют аргументы, которые позволяют вам более конкретно указывать местоположение файла (dir
) и наименование (prefix
, suffix
). Если вы хотите сохранить файлы, вы должны указать dir
, чтобы они не попадали во временный каталог по умолчанию, так как расположение по умолчанию может быть очищено ОС.