2013-07-01 35 views
6

Trong chương trình của tôi, nhiều quy trình có thể thử tạo tệp nếu tệp không tồn tại. Bây giờ tôi muốn đảm bảo rằng chỉ một trong các quy trình có thể tạo tệp và phần còn lại nhận được một ngoại lệ nếu nó đã được tạo (loại quy trình an toàn và mở thread an toàn). Làm thế nào tôi có thể đạt được điều này trong python.cách tạo tệp và ném ngoại lệ nếu đã tồn tại

Chỉ cần cho rõ ràng, những gì tôi muốn là tập tin được tạo ra nếu nó không tồn tại. Nhưng nếu nó đã tồn tại rồi ném một ngoại lệ. Và tất cả điều này sẽ xảy ra một cách nguyên tử.

Trả lời

6

Trong Python 2.x:

import os 

fd = os.open('filename', os.O_CREAT|os.O_EXCL) 
with os.fdopen(fd, 'w') as f: 
    .... 

Trong Python 3.3+:

with open('filename', 'x') as f: 
    .... 
+0

Mã này đạt được chức năng mong muốn. – Adobri

+0

@naxa, Tài liệu về Python 3.3+ ['open (..., 'x')'] (https://docs.python.org/3/library/functions.html#open) không có bất kỳ 'tính khả dụng nào 'thông tin; điều đó thường có nghĩa là nó hỗ trợ tất cả các nền tảng. Trong khi tài liệu về Python 2.x ['os.fdopen'] (https://docs.python.org/2/library/os.html#os.fdopen) đề cập đến tính khả dụng: Unix, Windows. – falsetru

+1

@naxa, Theo [tài liệu: hằng số cờ mở()] (https://docs.python.org/2/library/os.html#open-flag-constants): Các hằng số sau là các tùy chọn cho cờ tham số cho hàm open(). Chúng có thể được kết hợp bằng cách sử dụng toán tử OR bitwise |. Một số người trong số họ không có sẵn trên tất cả các nền tảng. Để biết mô tả về tính khả dụng và sử dụng của chúng, hãy tham khảo trang hướng dẫn mở (2) trên Unix hoặc MSDN trên Windows. – falsetru

4

Nếu bạn đang chạy trên một hệ thống Unix-like, mở tập tin như thế này:

f = os.fdopen(os.open(filename, os.O_CREAT | os.O_WRONLY | os.O_EXCL), 'w') 

Các O_EXCL cờ để os.open đảm bảo rằng các tập tin sẽ chỉ được tạo ra (và mở) nếu nó doesn' đã tồn tại, nếu không, ngoại lệ OSError sẽ được nâng lên. Việc kiểm tra sự tồn tại và tạo ra sẽ được thực hiện một cách nguyên tử, vì vậy bạn có thể có nhiều luồng hoặc các tiến trình cạnh tranh để tạo ra tệp, và chỉ có một cái sẽ thành công.

+0

Cả hai của những hằng số nên [có sẵn trên Windows cũng] (http: //docs.python. org/2/library/os.html # mở-cờ-hằng số). –

+1

Các hằng số có thể có sẵn, nhưng tôi sẽ không dám khẳng định rằng nguyên tử được thực hiện theo cùng một cách mà không cần một số nghiên cứu. – user4815162342

+0

Tôi nghĩ rằng những gì tôi yêu cầu là, nếu tập tin không tồn tại, mở nó nhưng nếu nó tồn tại (đã được tạo ra bởi một quá trình khác), sau đó ném một ngoại lệ. Có vẻ như mã này sẽ ném ngoại lệ nếu tệp không có và sẽ vượt qua nếu nó tồn tại. – Adobri

Các vấn đề liên quan