編集:Dave Jonesの回答も参照してください。Python3.3以降では、xフラグを使用してopen()この機能を提供できます。
以下の元の答え
はい、ただしPythonの標準open()呼び出しは使用しません。os.open()代わりにを使用する必要があります。これにより、基になるCコードにフラグを指定できます。
特に、使用したいO_CREAT | O_EXCL。Unixシステムのopen(2)under のmanページからO_EXCL:
この呼び出しでファイルが作成されることを確認してください。このフラグをと組み合わせて指定しO_CREAT、パス名がすでに存在する場合open()は失敗します。が指定されていO_EXCLない場合の動作は未定義ですO_CREAT。
これらの2つのフラグが指定されている場合、シンボリックリンクは追跡されません。パス名がシンボリックリンクopen()の場合、シンボリックリンクが指す場所に関係なく失敗します。
O_EXCL カーネル2.6以降でNFSv3以降を使用している場合、NFSでのみサポートされます。NFS O_EXCLサポートが提供されていない環境では、NFS サポートに依存してロックタスクを実行するプログラムには、競合状態が含まれます。
だから完璧ではありませんが、この競合状態を回避するために取得できる最も近いのはAFAIKです。
編集: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!")