Указание имени файла с помощью mkstemp, файл не найден - PullRequest
0 голосов
/ 08 марта 2019

Мне нужно иметь возможность создать временный файл с указанным именем файла и записать в него данные, а затем сжать указанный файл с именем файла вместе с другими файлами:

fd, path = tempfile.mkstemp(".bin", "filename", "~/path/to/working/directory/")
try:
    with os.fdopen(fd, "wb") as tmp:
        tmp.write(data)
    with ZipFile("zip.zip", "w") as zip:
        zip.write("filename")        
        zip.writestr("file2", file2_str)
        zip.writestr("file3", file3_str)
        # ...
finally:
    os.remove(path)

Я думаю, что должен бытьнеправильно понимая, как работает mkstemp, я получаю сообщение об ошибке в первой строке кода:

FileNotFoundError: [Errno 2] No such file or directory: '~/path/to/working/directory/filenameq5st7dey.bin'

Похоже, что куча мусора добавляется к имени файла до того, как суффикс добавленв файле.Я пробовал это без суффикса, и я все еще получаю мусор в конце имени файла.

Помимо мусора в имени файла, почему я получаю ошибку «файл не найден» вместо временногофайл, созданный в моем каталоге с таким именем (плюс мусор)?

1 Ответ

2 голосов
/ 08 марта 2019

Вы указали этот аргумент:

"~/path/to/working/directory/"

Совершенно естественно, имеет смысл, зачем вы его поставляете. Но это неправильно. Если вы ls ., скорее всего, вы не найдете каталог ~.

То, на что вы надеялись, это расширение до ${HOME}, как это делает оболочка Bourne. В Python мы должны вызвать эту функцию :

os.path.expanduser("~/path/to/working/directory/")

Напечатайте результат, который он возвращает, и вы поймете, почему он необходим.

Некоторые люди предпочитают, чтобы pathlib делал за них работу:

from pathlib import Path
Path("~/path/to/working/directory/").expanduser()
...