Bạn cũng có thể muốn tạo thư mục nếu nó không có ở đó.
Nguồn , nếu nó vẫn còn trên SO.
================================================== ===================
Trên Python ≥ 3.5, sử dụng pathlib.Path.mkdir
:
from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)
Đối với các phiên bản cũ hơn của Python, tôi thấy hai câu trả lời có phẩm chất tốt, mỗi câu trả lời có một lỗ hổng nhỏ, vì vậy tôi sẽ đưa ra ý kiến của mình về nó:
Hãy thử os.path.exists
, và xem xét os.makedirs
cho sự sáng tạo.
import os
if not os.path.exists(directory):
os.makedirs(directory)
Như đã lưu ý trong các bình luận và các nơi khác, có một điều kiện cuộc đua - nếu thư mục được tạo giữa os.path.exists
các os.makedirs
cuộc gọi và cuộc gọi, os.makedirs
sẽ thất bại với một OSError
. Thật không may, việc bắt OSError
và tiếp tục chăn không thể đánh lừa được, vì nó sẽ bỏ qua việc không tạo được thư mục do các yếu tố khác, chẳng hạn như không đủ quyền, đĩa đầy đủ, v.v.
Một tùy chọn sẽ là bẫy OSError
và kiểm tra mã lỗi được nhúng (xem Có cách nào để lấy thông tin từ nền tảng OSError của Python không ):
import os, errno
try:
os.makedirs(directory)
except OSError as e:
if e.errno != errno.EEXIST:
raise
Ngoài ra, có thể có một giây os.path.exists
, nhưng giả sử một thư mục khác đã tạo thư mục sau lần kiểm tra đầu tiên, sau đó xóa nó trước lần thứ hai - chúng ta vẫn có thể bị lừa.
Tùy thuộc vào ứng dụng, mức độ nguy hiểm của các hoạt động đồng thời có thể nhiều hơn hoặc ít hơn mức độ nguy hiểm gây ra bởi các yếu tố khác như quyền truy cập tệp. Nhà phát triển sẽ phải biết nhiều hơn về ứng dụng cụ thể đang được phát triển và môi trường dự kiến của nó trước khi chọn triển khai.
Các phiên bản hiện đại của Python cải thiện mã này khá nhiều, cả bằng cách phơi bày FileExistsError
(trong 3.3 +) ...
try:
os.makedirs("path/to/directory")
except FileExistsError:
# directory already exists
pass
... và bằng cách cho phép một đối số từ khóa os.makedirs
được gọiexist_ok
(trong 3.2+).
os.makedirs("path/to/directory", exist_ok=True) # succeeds even if directory exists.
os.stat
thay vào đó, để xem liệu cả thư mục có tồn tại và là một thư mục cùng một lúc không.