編集: Dave Jonesの回答も参照してください:Python 3.3から、x
フラグを使用しopen()
てこの機能を提供できます。
以下の元の回答
はい。ただし、Python の標準open()
呼び出しは使用しません。代わりに使用する必要がありますos.open()
。これにより、基になる C コードにフラグを指定できます。
特に、使用したいO_CREAT | O_EXCL
. 私のUnixシステムのopen(2)
下のmanページから:O_EXCL
この呼び出しがファイルを作成することを確認してください。このフラグが と組み合わせて指定されO_CREAT
、パス名が既に存在する場合、open()
失敗します。が指定されていない場合の動作O_EXCL
は未定義ですO_CREAT
。
これら 2 つのフラグが指定されている場合、シンボリック リンクはたどられません。パス名がシンボリック リンクopen()
の場合、シンボリック リンクがどこを指しているかに関係なく失敗します。
O_EXCL
カーネル 2.6 以降で NFSv3 以降を使用している場合、NFS でのみサポートされます。NFSO_EXCL
サポートが提供されていない環境では、ロック タスクを実行するために NFS に依存するプログラムには競合状態が含まれます。
完璧ではありませんが、知る限り、この競合状態を回避するのに最も近い方法です。
編集:os.open()
代わりに使用する他のルールがopen()
引き続き適用されます。特に、返されたファイル記述子を読み取りまたは書き込みに使用する場合はO_RDONLY
、フラグO_WRONLY
またはO_RDWR
フラグも必要です。
すべてのO_*
フラグは Python のos
モジュールにあるため、必要に応じて使用する必要が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!")