Edit : Lihat juga jawaban Dave Jones : dari Python 3.3, Anda dapat menggunakan xflag to open()untuk menyediakan fungsi ini.
Jawaban asli di bawah
Ya, tetapi tidak menggunakan open()panggilan standar Python . Anda harus menggunakan os.open()sebagai gantinya, yang memungkinkan Anda menentukan bendera ke kode C yang mendasarinya.
Secara khusus, Anda ingin menggunakan O_CREAT | O_EXCL. Dari halaman manual untuk di open(2)bawah O_EXCLpada sistem Unix saya:
Pastikan panggilan ini membuat file: jika tanda ini ditentukan sehubungan dengan O_CREAT, dan nama jalur sudah ada, maka open()akan gagal. Perilaku O_EXCLtidak ditentukan jika O_CREATtidak ditentukan.
Ketika dua bendera ini ditentukan, tautan simbolis tidak diikuti: jika nama jalur adalah tautan simbolis, maka open()gagal terlepas dari ke mana tautan simbolis menunjuk.
O_EXCL hanya didukung di NFS saat menggunakan NFSv3 atau yang lebih baru pada kernel 2.6 atau yang lebih baru. Di lingkungan di mana O_EXCLdukungan NFS tidak tersedia, program yang mengandalkannya untuk melakukan tugas penguncian akan berisi kondisi balapan.
Jadi memang tidak sempurna, tapi AFAIK paling dekat bisa Anda hindari untuk menghindari kondisi balapan ini.
Sunting: aturan penggunaan lain os.open()daripada open()tetap berlaku. Secara khusus, jika Anda ingin menggunakan deskriptor file yang dikembalikan untuk membaca atau menulis, Anda memerlukan salah satu tanda O_RDONLY, O_WRONLYatau O_RDWRjuga.
Semua O_*bendera ada di osmodul Python , jadi Anda harus import osdan menggunakan os.O_CREATdll.
Contoh:
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!")