Python'da dizin olup olmadığını bulma


1138

In osPython modülü, bir dizin gibi bir şey varsa bulmak için bir yol yoktur:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

8
Bir uyarı - en yüksek puanlı yanıt yarış koşullarına duyarlı olabilir. Bunun os.statyerine, dizinin hem var olup olmadığını hem de aynı anda bir dizin olup olmadığını görmek isteyebilirsiniz.
d33tah

1
@ d33tah İyi bir noktanız olabilir, ancak os.statbir dosyadan dizin anlatmak için kullanmanın bir yolunu göremiyorum . OSErrorDosya veya dizin olsun, yol geçersiz olduğunda yükselir . Ayrıca, kontrol ettikten sonra herhangi bir kod da yarış koşullarına karşı hassastır.
Tomáš Zato - Monica'yı eski durumuna döndür

4
@ TomášZato: bu sadece işlemi gerçekleştirmek ve hataları işlemek için güvenli olduğu sonucuna yol açar.
d33tah

2
@ David542 Ben "isdir" "var" doğruluk testleri ile bir açıklama durumu ekledim. Sanırım şimdi her şeyi öğreneceksin. Ancak yeni insanları aydınlatabilir.
GeoStoneMarten

Yanıtlar:


1728

Aradığınız os.path.isdirveya os.path.existsbunu bir dosya ya da dizin olsun umursamazsak.

Misal:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
@syedrakib Bir nesnenin çağrılabilir olduğunu belirtmek için parantez kullanılabilirken, sınıflar bile çağrılabilir olduğundan bu Python için yararlı değildir. Ayrıca, işlevler Python'daki birinci sınıf değerlerdir ve bunları parantez notasyonu olmadan kullanabilirsiniz , örneğinexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag

10
İşlevleri gibi diğer işlevlere geçirebilirsiniz map, ancak genel durumda işlevleri bağımsız değişkenler ve parantezler ile çağırırsınız. Ayrıca, örneğinizde bazı yazım hataları var. muhtemelen demek istiyorsun filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown

4
Ayrıca, os.path.isfile(path)yalnızca bir dosya olup olmadığını önemsiyorsanız.
Nicholas

2
Bazı platformlarda dosya / dizin varsa bunların yanlış döndürüleceğini, ancak bir okuma izni hatası oluştuğunu unutmayın.
cowlinator

74

Çok yakın! o anda var olan bir dizinin adını iletirseniz os.path.isdirdöndürür True. Eğer yoksa veya bir dizin değilse, geri döner False.


70

Piton 3.4 kişiye modülü kolu dosya sistemi yolları için bir nesne yönelimli yaklaşım sağlar standart kitaplığı, içine. Ve bir yöntemleri nesne soruyu cevaplamak için kullanılabilir:pathlibis_dir()exists()Path

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

Yollar (ve dizeler) /operatörle birleştirilebilir:

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

Pathlib, PyPi'deki pathlib2 modülü aracılığıyla Python 2.7'de de mevcuttur .


Bazı açıklamalar yardımcı olacaktır. Neden yapıyorsun p / 'bin' / 'vim'? "
Nathan

1
@frank Cevabın ikinci kısmı üzerinde biraz durdum.
joelostblom

34

Evet, kullanın os.path.exists().


23
Bu, yolun bir dizin olup olmadığını denetlemez.
Kirk Strauser

7
İyi karar. Diğerleri os.path.isdirbunun başaracağına dikkat çekti .
aganders3

3
Bunun soruyu cevaplamadığını anlarsanız, neden cevabı kaldırmıyorsunuz?

3
@CamilStaps Bu soru 354000 kez izlendi (şimdiye kadar). Buradaki cevaplar sadece OP için değil, herhangi bir nedenle buraya gelebilecek herkes içindir. aganders3'ün cevabı OP'nin problemini doğrudan çözmese bile geçerlidir.
Gabriel

4
@ Gabriel sonra cevapta bunun gerçekte ne yaptığını açıkça belirtmeliyiz.

21

2 dahili fonksiyon ile kontrol edebiliriz

os.path.isdir("directory")

Belirtilen dizinin kullanılabilir olduğu boolean true değerini verecektir.

os.path.exists("directoryorfile")

Belirtilen dizin veya dosya mevcutsa, boolead'e true değerini verir.

Yolun dizin olup olmadığını kontrol etmek için;

os.path.isdir("directorypath")

yol dizini ise boole true değerini verir


2
Bu, daha eski, en büyük cevapla tamamen gereksizdir.
Davis Herring


10

De olduğu gibi:

In [3]: os.path.exists('/d/temp')
Out[3]: True

Muhtemelen os.path.isdir(...)emin olmak için a atın .


10

Sadece os.statsürümü sağlamak için (python 2):

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise

7

os size bu özelliklerin çoğunu sunar:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

giriş yolu geçersizse listdir bir istisna atar.


5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')

6
python dizinleri oluşturmak için yerleşik fonksiyonları vardır, os.makedirs('mydir')yerine daha iyi kullanınos.system(...)
gizzmole

9
'Yeni dizin oluşturuldu' yazdırabilirsiniz, ancak bunu bilmiyorsunuz. Dizin oluşturma izniniz yoksa ne olur? 'Yeni dizin oluşturuldu' yazdırabilirsiniz , ancak bu doğru olmaz. Olur mu.
Wojciech Jakubas

4

Uygun bir Unipathmodül var.

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

İhtiyacınız olabilecek diğer ilgili şeyler:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

Pip kullanarak kurabilirsiniz:

$ pip3 install unipath

Yerleşik olana benzer pathlib. Fark, her yolu bir dize olarak ele almasıdır ( Pathbir alt sınıfıdır str), bu nedenle bazı işlevler bir dize beklerse, bir Pathnesneyi dizeye dönüştürmeye gerek kalmadan kolayca iletebilirsiniz .

Örneğin, bu Django ve settings.py:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'

4

Orada yoksa dizini oluşturmak da isteyebilirsiniz.

Kaynak , eğer hala SO'da ise.

================================================== ===================

Python ≥ 3.5'te pathlib.Path.mkdirşunları kullanın :

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

Python'un daha eski sürümleri için, her biri küçük bir kusuru olan iyi niteliklere sahip iki cevap görüyorum, bu yüzden onu ele alacağım:

Deneyin os.path.existsve os.makedirsyaratmayı düşünün .

import os
if not os.path.exists(directory):
    os.makedirs(directory)

Yorumların ve başka yerlerde belirtildiği gibi, bir yarış durumu var - dizin arasında oluşturulursa os.path.existsve os.makedirsçağrılar, os.makedirsbir başarısız olur OSError. Ne yazık ki, battaniye yakalama OSErrorve devam etme, yetersiz izinler, tam disk vb.Gibi diğer faktörler nedeniyle dizin oluşturma hatasını göz ardı edeceğinden kusursuz değildir.

Bir seçenek OSError, gömülü hata kodunu yakalamak ve incelemek olacaktır (bkz . Python'un OSError'undan bilgi almanın platformlar arası bir yolu var mı? ):

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

Alternatif olarak, bir saniye olabilir os.path.exists, ancak ilk kontrolden sonra başka bir dizin oluşturduğunu, sonra ikinci kontrolden önce kaldırdığını varsayalım - yine de kandırabiliriz.

Uygulamaya bağlı olarak, eşzamanlı işlem tehlikesi, dosya izinleri gibi diğer faktörlerin oluşturduğu tehlikeden daha fazla veya daha az olabilir. Bir uygulama seçmeden önce geliştiricinin geliştirilmekte olan belirli uygulama ve beklenen ortamı hakkında daha fazla bilgi sahibi olması gerekir.

Python'un modern sürümleri bu kodu biraz açığa çıkarır, hem de FileExistsError(3.3 + 'da) ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... ve bir anahtar kelime bağımsız değişkeninin os.makedirsçağrılmasınaexist_ok izin vererek (3.2+).

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

0

İki şey

  1. dizinin var olup olmadığını kontrol etmeli mi?
  2. değilse, bir dizin oluşturun (isteğe bağlı).
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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.