Kiểm tra nếu một thư mục tồn tại và tạo nó nếu cần thiết?
Câu trả lời trực tiếp cho vấn đề này là, giả sử một tình huống đơn giản mà bạn không mong đợi người dùng hoặc quy trình khác sẽ gây rối với thư mục của mình:
if not os.path.exists(d):
os.makedirs(d)
hoặc nếu làm cho thư mục tuân theo các điều kiện chủng tộc (nghĩa là nếu sau khi kiểm tra đường dẫn tồn tại, một cái gì đó khác có thể đã được thực hiện) làm điều này:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Nhưng có lẽ một cách tiếp cận thậm chí tốt hơn là vượt qua vấn đề tranh chấp tài nguyên, bằng cách sử dụng các thư mục tạm thời thông qua tempfile
:
import tempfile
d = tempfile.mkdtemp()
Đây là những điều cần thiết từ tài liệu trực tuyến:
mkdtemp(suffix='', prefix='tmp', dir=None)
User-callable function to create and return a unique temporary
directory. The return value is the pathname of the directory.
The directory is readable, writable, and searchable only by the
creating user.
Caller is responsible for deleting the directory when done with it.
Mới trong Python 3.5: pathlib.Path
vớiexist_ok
Có một Path
đối tượng mới (kể từ 3,4) với rất nhiều phương thức người ta muốn sử dụng với các đường dẫn - một trong số đó là mkdir
.
(Đối với ngữ cảnh, tôi đang theo dõi đại diện hàng tuần của mình bằng một tập lệnh. Đây là các phần mã có liên quan từ tập lệnh cho phép tôi tránh nhấn Stack Overflow hơn một lần mỗi ngày cho cùng một dữ liệu.)
Đầu tiên là hàng nhập khẩu có liên quan:
from pathlib import Path
import tempfile
Chúng ta không phải đối phó với os.path.join
bây giờ - chỉ cần tham gia các phần đường dẫn với /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Sau đó, tôi tạm thời đảm bảo thư mục tồn tại - exist_ok
đối số hiển thị trong Python 3.5:
directory.mkdir(exist_ok=True)
Đây là phần có liên quan của tài liệu :
Nếu exist_ok
là đúng, các FileExistsError
ngoại lệ sẽ bị bỏ qua (hành vi tương tự như POSIX mkdir -p
lệnh), nhưng chỉ khi thành phần đường dẫn cuối cùng không phải là tệp không có thư mục hiện có.
Đây là một chút về kịch bản - trong trường hợp của tôi, tôi không phải chịu điều kiện chủng tộc, tôi chỉ có một quy trình hy vọng thư mục (hoặc tệp chứa) sẽ ở đó và tôi không có bất cứ điều gì cố gắng xóa cac thu mục.
todays_file = directory / str(datetime.datetime.utcnow().date())
if todays_file.exists():
logger.info("todays_file exists: " + str(todays_file))
df = pd.read_json(str(todays_file))
Path
các đối tượng phải được ép buộc str
trước các API khác mong muốn str
các đường dẫn có thể sử dụng chúng.
Có lẽ Pandas nên được cập nhật để chấp nhận các thể hiện của lớp cơ sở trừu tượng , os.PathLike
.