Редагувати : Див. Також відповідь Дейва Джонса : з Python 3.3 ви можете використовувати xпрапор open()для надання цієї функції.
Оригінальна відповідь нижче
Так, але не використовуючи стандартний open()виклик Python . Вам потрібно буде використовувати os.open()замість цього, що дозволяє вказати прапори для базового коду C.
Зокрема, ви хочете використовувати O_CREAT | O_EXCL. На сторінці людини для open(2)Under O_EXCLна моїй системі Unix:
Переконайтеся, що цей виклик створює файл: якщо цей прапорець вказаний у поєднанні з O_CREATі ім'я шляху вже існує, тоді open()він не вдасться. Поведінка параметра O_EXCLне визначено, якщо O_CREATне вказано.
Коли вказані ці два прапори, символічні посилання не виконуються: якщо ім'я шляху є символічним посиланням, воно open()не працює незалежно від того, куди вказує символічне посилання.
O_EXCL підтримується лише на NFS при використанні NFSv3 або пізнішої версії на ядрі 2.6 або пізнішої версії. У середовищах, де O_EXCLпідтримка NFS не надається, програми, які покладаються на неї для виконання завдань блокування, містять умову перегонів.
Тож це не ідеально, але AFAIK - це найближче, що ви можете досягти, щоб уникнути цього стану перегонів.
Редагувати: інші правила використання os.open()замість того, щоб open()все ще застосовуватися. Зокрема, якщо ви хочете використовувати повернений дескриптор файлу для читання або запису, вам буде потрібно одна з O_RDONLY, O_WRONLYабо O_RDWRпрапори , а також.
Всі O_*прапори знаходяться в osмодулі Python , тому вам потрібно буде import osвикористовувати os.O_CREATі т.д.
Приклад:
import os
import errno
flags = os.O_CREAT | os.O_EXCL | os.O_WRONLY
try:
file_handle = os.open('filename', flags)
except OSError as e:
if e.errno == errno.EEXIST: # Failed as the file already exists.
pass
else: # Something unexpected went wrong so reraise the exception.
raise
else: # No exception, so the file must have been created successfully.
with os.fdopen(file_handle, 'w') as file_obj:
# Using `os.fdopen` converts the handle to an object that acts like a
# regular Python file object, and the `with` context manager means the
# file will be automatically closed when we're done with it.
file_obj.write("Look, ma, I'm writing to a new file!")