Постоянное использование временных файлов Python

В настоящее время я немного злоупотребляю tempfile, используя его для создания уникальных имен для постоянных файлов. Я использую следующую функцию для получения уникального идентификатора:

def gen_id():
    tf = tempfile.mktemp()
    tfname = os.path.split(tf)[1]
    return tfname.strip(tempfile.gettempprefix())

Затем я сохраняю файл в настраиваемом каталоге с именем файла из этой функции. Я использую эту функцию для большей гибкости, чем встроенные функции; с помощью этой функции я могу выбрать свой собственный каталог и удалить префикс tmp.

Поскольку tempfiles должны быть «временными файлами», есть ли опасность использовать их уникальность для таких постоянных файлов? Есть ли причины, по которым моя функция небезопасна для создания уникальных идентификаторов?

РЕДАКТИРОВАТЬ: У меня возникла идея использовать tempfile для уникальных имен из этого SO-ответа.


person Luke Taylor    schedule 07.05.2016    source источник
comment
Имена не могут быть уникальными в другом каталоге.   -  person martineau    schedule 07.05.2016
comment
Однако каталог будет только заполнен tempfiles. Вы имеете в виду, что tempfile будет просматривать каталог перед созданием имени?   -  person Luke Taylor    schedule 07.05.2016
comment
Использование устаревшей функции tempfiles.mktemp() не гарантирует уникальности звучания. как вам нужно.   -  person martineau    schedule 07.05.2016


Ответы (2)


help(tempfile.mktemp) -> "Эта функция небезопасна и не должна использоваться. Имя файла относится к файлу, который в какой-то момент не существовал, но к тому времени, когда вы дойдете до его создания, кто-то другой, возможно, превзошел вас. удар. "

то есть вы можете получить из этого имя файла, имя которого совпадает с именем существующего файла.

Замена - tempfile.mkstemp(), и она действительно создает файл, который обычно необходимо удалить после использования ... но вы можете указать ему, где находится ваш настраиваемый каталог, и указать ему не использовать префикс, и позволить ему создавать файлы для ты полная остановка. И он будет проверять существующие файлы с тем же именем и создавать новые имена, пока не найдет неиспользуемое имя.

tempfile.mkstemp(suffix="", prefix=template, dir=None, text=False)

(Модуль tempfile написан на Python, вы можете увидеть его код в \ Lib \ tempfile.py)

person TessellatingHeckler    schedule 07.05.2016
comment
Я не думаю, что это устарело. Комментарии в функции mktemp() объясняют, что с ней не так и почему ее не следует использовать, и говорят, что она все еще существует только для обратной совместимости со старым кодом, который был написан для ее использования. Комментарии / помощь для mkstemp и mkdtemp ничего подобного не говорят, поэтому я предполагаю, что они актуальны и действительны, как и все остальное, но я не могу это доказать. - person TessellatingHeckler; 07.05.2016
comment
OK. Теперь я это вижу, удалил свой другой комментарий, потому что я мог просто посмотреть в документации, чтобы убедиться, что это не так. У меня остается один вопрос: что означает «Отсутствие состояния гонки» при создании файла? - person Luke Taylor; 07.05.2016
comment
Состояние гонки - это тип ошибки, при которой два бита кода делают одно и то же одновременно, и какая удача работает, а какая вылетает, - гонка к финишу. Здесь два бита кода вызывают mktemp, и он может дать одинаковое случайное имя файла обоим; они оба пытаются открыть файл с таким именем, и одному из них повезет, и он будет работать, а другой выйдет из строя. Вместо этого, чтобы избежать гонки, mkstemp не возвращает имя файла до тех пор, пока файл не будет успешно открыт. Тогда у обоих битов кода нет шанса получить одно и то же имя файла, нет состояния гонки или сбоя. - person TessellatingHeckler; 08.05.2016

Я настоятельно рекомендую просто использовать этот комментарий из тот же ответ, что и способ создания уникальных имен.

Не нужно злоупотреблять mktemp для этого (и это в любом случае устарело).

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

В этом случае использование случайного выбора имеет меньше шансов вызвать столкновения и не имеет недостатков. Однако у вас должна быть проверка на небольшую вероятность возникновения столкновения, и в этом случае вам следует сгенерировать новое имя.

person Bharel    schedule 07.05.2016