Słowo ostrzeżenia - najwyżej oceniana odpowiedź może być podatna na warunki wyścigowe. Możesz os.statzamiast tego wykonać , aby sprawdzić, czy katalog istnieje i jest katalogiem w tym samym momencie.
d33tah
1
@ d33tah Być może masz rację, ale nie widzę sposobu na odróżnienie os.statkatalogu od pliku. Podnosi się, OSErrorgdy ścieżka jest nieprawidłowa, bez względu na to, czy jest to plik, czy katalog. Ponadto każdy kod po sprawdzeniu jest również podatny na warunki wyścigu.
Tomáš Zato - Przywróć Monikę
4
@ TomášZato: co prowadzi do wniosku, że bezpiecznie jest po prostu wykonać operację i obsługiwać błędy.
d33tah
2
@ David542 Dodałem przypadek wyjaśniający z testami dokładności dla „isdir” „istnieje”. Myślę, że nauczyłbyś się teraz wszystkiego. Ale może oświetlić nowych ludzi.
@syedrakib Chociaż można użyć nawiasów, aby wskazać, że obiekt można wywoływać, nie jest to przydatne w Pythonie, ponieważ można wywoływać nawet klasy. Ponadto funkcje są pierwszorzędnymi wartościami w Pythonie i można ich używać bez zapisu w nawiasach, na przykład wexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag
10
Możesz przekazać funkcje do innych funkcji, takich jak map, ale w ogólnym przypadku wywołujesz funkcje z argumentami i nawiasami. W twoim przykładzie jest też literówka. prawdopodobnie masz na myśli filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown
4
Jest również, os.path.isfile(path)jeśli zależy ci tylko na tym, czy jest to plik.
Nicholas
2
Należy pamiętać, że na niektórych platformach zwracają wartość false, jeśli plik / katalog istnieje, ale występuje również błąd uprawnień do odczytu.
cowlinator,
73
Tak blisko! os.path.isdirzwraca, Truejeśli podasz nazwę katalogu, który obecnie istnieje. Jeśli nie istnieje lub nie jest katalogiem, zwraca False.
Python 3.4 wprowadziła ten pathlibmoduł w bibliotece standardowej, która zapewnia zorientowaną podejścia obiektowego do ścieżek uchwyt systemu plików. Te is_dir()i exists()metody z Pathobiektu mogą być wykorzystane, aby odpowiedzieć na pytanie:
In[1]:from pathlib importPathIn[2]: p =Path('/usr')In[3]: p.exists()Out[3]:TrueIn[4]: p.is_dir()Out[4]:True
Ścieżki (i ciągi) można łączyć razem z /operatorem:
In[5]: q = p /'bin'/'vim'In[6]: qOut[6]:PosixPath('/usr/bin/vim')In[7]: q.exists()Out[7]:TrueIn[8]: q.is_dir()Out[8]:False
Dobra decyzja. Inni wskazali, że os.path.isdirto osiągnie.
aganders3
3
Jeśli rozumiesz, że to nie odpowiada na pytanie, dlaczego nie usuniesz odpowiedzi?
3
@CamilStaps To pytanie było oglądane 354000 razy (do tej pory). Odpowiedzi tutaj są nie tylko dla OP, są dla każdego, kto mógłby tu przyjechać z jakiegokolwiek powodu. Odpowiedź aganders3 jest trafna, nawet jeśli nie rozwiązuje bezpośrednio problemu OP.
Gabriel
4
@Gabriel, w odpowiedzi należy wyjaśnić, co to właściwie robi.
21
Możemy to sprawdzić za pomocą 2 wbudowanych funkcji
os.path.isdir("directory")
Da logiczną wartość true, określony katalog jest dostępny.
os.path.exists("directoryorfile")
Daje boolead true, jeśli określony katalog lub plik jest dostępny.
Aby sprawdzić, czy ścieżka jest katalogiem;
os.path.isdir("directorypath")
da wartość logiczną true, jeśli ścieżka jest katalogiem
python ma wbudowane funkcje do tworzenia katalogów, więc lepiej użyć os.makedirs('mydir')zamiastos.system(...)
gizzmole
9
Drukujesz, że „utworzono nowy katalog”, ale nie wiesz o tym. Co zrobić, jeśli nie masz uprawnień do utworzenia katalogu? Wydrukowałbyś „utworzono nowy katalog”, ale nie byłoby to prawdą. Zrobiłbym to.
Jest podobny do wbudowanego pathlib. Różnica polega na tym, że traktuje każdą ścieżkę jako ciąg ( Pathjest podklasą str), więc jeśli jakaś funkcja oczekuje ciągu, możesz z łatwością przekazać mu Pathobiekt bez konieczności konwertowania go na ciąg.
Na przykład działa to świetnie z Django i settings.py:
import os
ifnot 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.existsi, os.makedirspołączenie os.makedirszakończy się niepowodzeniem OSError. Niestety łapanie OSErrori 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.
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 +) ...
import os
dirpath ="<dirpath>"# Replace the "<dirpath>" with actual directory path.if os.path.exists(dirpath):print("Directory exist")else:#this is optional if you want to create a directory if doesn't exist.
os.mkdir(dirpath):print("Directory created")
os.stat
zamiast tego wykonać , aby sprawdzić, czy katalog istnieje i jest katalogiem w tym samym momencie.os.stat
katalogu od pliku. Podnosi się,OSError
gdy ścieżka jest nieprawidłowa, bez względu na to, czy jest to plik, czy katalog. Ponadto każdy kod po sprawdzeniu jest również podatny na warunki wyścigu.Odpowiedzi:
Szukasz
os.path.isdir
lubos.path.exists
nie przejmujesz się, czy jest to plik, czy katalog.Przykład:
źródło
existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
map
, ale w ogólnym przypadku wywołujesz funkcje z argumentami i nawiasami. W twoim przykładzie jest też literówka. prawdopodobnie masz na myślifilter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])
.os.path.isfile(path)
jeśli zależy ci tylko na tym, czy jest to plik.Tak blisko!
os.path.isdir
zwraca,True
jeśli podasz nazwę katalogu, który obecnie istnieje. Jeśli nie istnieje lub nie jest katalogiem, zwracaFalse
.źródło
Python 3.4 wprowadziła ten
pathlib
moduł w bibliotece standardowej, która zapewnia zorientowaną podejścia obiektowego do ścieżek uchwyt systemu plików. Teis_dir()
iexists()
metody zPath
obiektu mogą być wykorzystane, aby odpowiedzieć na pytanie:Ścieżki (i ciągi) można łączyć razem z
/
operatorem:Pathlib jest również dostępny w Pythonie 2.7 za pośrednictwem modułu pathlib2 w PyPi.
źródło
p / 'bin' / 'vim'
? ”Tak, użyj
os.path.exists()
.źródło
os.path.isdir
to osiągnie.Możemy to sprawdzić za pomocą 2 wbudowanych funkcji
Da logiczną wartość true, określony katalog jest dostępny.
Daje boolead true, jeśli określony katalog lub plik jest dostępny.
Aby sprawdzić, czy ścieżka jest katalogiem;
os.path.isdir("directorypath")
da wartość logiczną true, jeśli ścieżka jest katalogiem
źródło
Tak, użyj os.path.isdir (ścieżka)
źródło
Jak w:
Prawdopodobnie wrzuć to
os.path.isdir(...)
dla pewności.źródło
Wystarczy podać
os.stat
wersję (python 2):źródło
os zapewnia wiele z tych możliwości:
listdir zgłosi wyjątek, jeśli ścieżka wejściowa jest nieprawidłowa.
źródło
źródło
os.makedirs('mydir')
zamiastos.system(...)
Jest wygodny
Unipath
moduł.Inne powiązane rzeczy, których możesz potrzebować:
Możesz go zainstalować za pomocą pipa:
Jest podobny do wbudowanego
pathlib
. Różnica polega na tym, że traktuje każdą ścieżkę jako ciąg (Path
jest podklasąstr
), więc jeśli jakaś funkcja oczekuje ciągu, możesz z łatwością przekazać muPath
obiekt bez konieczności konwertowania go na ciąg.Na przykład działa to świetnie z Django i
settings.py
:źródło
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
: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.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łączenieos.makedirs
zakończy się niepowodzeniemOSError
. Niestety łapanieOSError
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 ):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 +) ...... i pozwalając argument słowa kluczowego dla
os.makedirs
nazywanyexist_ok
(w 3.2 lub nowszym).źródło
Dwie rzeczy
źródło