Możesz także utworzyć katalog, jeśli go tam nie ma.
Źródło , jeśli nadal istnieje na SO.
================================================== ===================
W Pythonie ≥ 3.5 użyj pathlib.Path.mkdir
:
from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)
W przypadku starszych wersji Pythona widzę dwie odpowiedzi o dobrych cechach, każda z małą wadą, więc przyjmuję to:
Spróbuj os.path.exists
i zastanów się os.makedirs
nad stworzeniem.
import os
if not os.path.exists(directory):
os.makedirs(directory)
Jak zauważono w komentarzach i gdzie indziej, istnieje warunek wyścigu - jeśli katalog zostanie utworzony między połączeniami os.path.exists
i, os.makedirs
połączenie os.makedirs
zakończy się niepowodzeniem OSError
. Niestety łapanie OSError
i kontynuowanie koców nie jest niezawodne, ponieważ zignoruje niepowodzenie tworzenia katalogu z powodu innych czynników, takich jak niewystarczające uprawnienia, pełny dysk itp.
Jedną z opcji byłoby przechwycenie OSError
i sprawdzenie osadzonego kodu błędu (zobacz Czy istnieje wieloplatformowy sposób uzyskiwania informacji z OSError Pythona ):
import os, errno
try:
os.makedirs(directory)
except OSError as e:
if e.errno != errno.EEXIST:
raise
Alternatywnie może istnieć sekunda os.path.exists
, ale załóżmy, że inny utworzył katalog po pierwszym sprawdzeniu, a następnie usunął go przed drugim - nadal możemy się oszukać.
W zależności od aplikacji niebezpieczeństwo równoczesnych operacji może być większe lub mniejsze niż niebezpieczeństwo stwarzane przez inne czynniki, takie jak uprawnienia do plików. Deweloper musiałby dowiedzieć się więcej o konkretnej aplikacji i jej oczekiwanym środowisku przed wybraniem implementacji.
Nowoczesne wersje Pythona znacznie poprawiają ten kod, zarówno poprzez ujawnienie FileExistsError
(w wersji 3.3 +) ...
try:
os.makedirs("path/to/directory")
except FileExistsError:
# directory already exists
pass
... i pozwalając argument słowa kluczowego dla os.makedirs
nazywanyexist_ok
(w 3.2 lub nowszym).
os.makedirs("path/to/directory", exist_ok=True) # succeeds even if directory exists.
os.stat
zamiast tego wykonać , aby sprawdzić, czy katalog istnieje i jest katalogiem w tym samym momencie.