Chỉnh sửa : Xem thêm câu trả lời của Dave Jones : từ Python 3.3, bạn có thể sử dụng xcờ đểopen() để cung cấp chức năng này.
Câu trả lời gốc bên dưới
Có, nhưng không sử dụng open()lệnh gọi tiêu chuẩn của Python . os.open()Thay vào đó, bạn sẽ cần phải sử dụng , điều này cho phép bạn chỉ định cờ cho mã C bên dưới.
Đặc biệt, bạn muốn sử dụng O_CREAT | O_EXCL. Từ trang người đàn ông cho open(2)dưới O_EXCLtrên hệ thống Unix của tôi:
Đảm bảo rằng lệnh gọi này tạo ra tệp: nếu cờ này được chỉ định cùng với O_CREATvà tên đường dẫn đã tồn tại, thì open()sẽ không thành công. Hành vi của O_EXCLkhông được xác định nếuO_CREAT không được chỉ định.
Khi hai cờ này được chỉ định, các liên kết tượng trưng không được tuân theo: nếu tên đường dẫn là một liên kết tượng trưng, thì open() sẽ không thành công bất kể nơi liên kết tượng trưng trỏ đến.
O_EXCL chỉ được hỗ trợ trên NFS khi sử dụng NFSv3 trở lên trên hạt nhân 2.6 trở lên. Trong các môi trường O_EXCLkhông cung cấp hỗ trợ NFS , các chương trình dựa vào nó để thực hiện các tác vụ khóa sẽ chứa một điều kiện đua.
Vì vậy, nó không hoàn hảo, nhưng AFAIK là cách gần nhất bạn có thể tránh được tình trạng cuộc đua này.
Chỉnh sửa: các quy tắc sử dụng os.open()thay thế khác open()vẫn được áp dụng. Đặc biệt, nếu bạn muốn sử dụng các mô tả tập tin trở lại cho việc đọc hoặc viết, bạn sẽ cần một trong những O_RDONLY, O_WRONLYhoặcO_RDWR cờ là tốt.
Tất cả các O_*cờ đều nằm trong osmô-đun của Python , vì vậy bạn sẽ cần import osvà sử dụng, os.O_CREATv.v.
Thí dụ:
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!")