Cara menemukan apakah direktori ada di Python

1139

Dalam osmodul dengan Python, apakah ada cara untuk menemukan apakah direktori ada, sesuatu seperti:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False
David542
sumber
8
Sebuah kata peringatan - jawaban dengan peringkat tertinggi mungkin rentan terhadap kondisi lomba. Anda mungkin ingin melakukan os.statsebaliknya, untuk melihat apakah direktori keduanya ada dan merupakan direktori pada saat yang sama.
d33tah
1
@ d33tah Anda mungkin memiliki poin bagus tetapi saya tidak melihat cara untuk menggunakan os.statuntuk memberitahu direktori dari file. Itu memunculkan OSErrorketika path tidak valid, tidak peduli apakah itu file atau direktori. Juga, kode apa pun setelah pengecekan juga rentan terhadap kondisi balapan.
Tomáš Zato - Reinstate Monica
4
@ TomášZato: yang mengarah pada kesimpulan bahwa aman untuk hanya melakukan operasi dan menangani kesalahan.
d33tah
2
@ David542 Saya menambahkan kasus klarifikasi dengan tes untuk presisi untuk "isdir" "ada". Saya pikir Anda akan belajar apa saja sekarang. Tapi itu bisa menerangi orang baru.
GeoStoneMarten

Jawaban:

1729

Anda sedang mencari os.path.isdir, atau os.path.existsjika Anda tidak peduli apakah itu file atau direktori.

Contoh:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))
phihag
sumber
4
@syedrakib Sementara tanda kurung dapat digunakan untuk menunjukkan bahwa suatu objek dapat dipanggil, itu tidak berguna dalam Python, karena bahkan kelas pun dapat dipanggil. Juga, fungsi adalah nilai kelas satu dalam Python, dan Anda dapat menggunakannya tanpa notasi tanda kurung, seperti diexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag
10
Anda dapat meneruskan fungsi ke fungsi lain, seperti map, tetapi dalam kasus umum, Anda memanggil fungsi dengan argumen dan tanda kurung. Juga, ada beberapa kesalahan ketik pada contoh Anda. mungkin maksudmu filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown
4
Juga, ada os.path.isfile(path)jika Anda hanya peduli apakah itu file.
Nicholas
2
Ketahuilah bahwa pada beberapa platform ini akan kembali salah jika file / direktori ada, tetapi kesalahan izin baca juga terjadi.
cowlinator
74

Sangat dekat! os.path.isdirkembali Truejika Anda memasukkan nama direktori yang saat ini ada. Jika tidak ada atau itu bukan direktori, maka itu kembali False.

Kirk Strauser
sumber
70

Python 3.4 diperkenalkan pada pathlibmodul ke dalam perpustakaan standar, yang menyediakan pendekatan berorientasi objek untuk jalur menangani filesystem. The is_dir()dan exists()metode dari Pathobjek dapat digunakan untuk menjawab pertanyaan:

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

Jalur (dan string) dapat digabungkan bersama dengan /operator:

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 juga tersedia di Python 2.7 melalui modul pathlib2 di PyPi.

joelostblom
sumber
Beberapa penjelasan akan sangat membantu. Mengapa kamu melakukan " p / 'bin' / 'vim'?
Nathan
1
@ jujur ​​saya menguraikan sedikit pada bagian kedua dari jawaban.
joelostblom
34

Ya, gunakan os.path.exists().

aganders3
sumber
23
Itu tidak memeriksa bahwa path adalah direktori.
Kirk Strauser
7
Panggilan yang bagus. Orang lain telah menunjukkan bahwa os.path.isdirakan mencapai itu.
aganders3
3
Jika Anda mengerti bahwa ini tidak menjawab pertanyaan, mengapa Anda tidak menghapus jawabannya?
3
@CamilStaps Pertanyaan ini telah dilihat 354000 kali (sekarang). Jawaban di sini bukan hanya untuk OP, tetapi juga untuk siapa saja yang bisa datang ke sini untuk alasan apa pun. Jawaban aganders3 relevan bahkan jika itu tidak secara langsung menyelesaikan masalah OP.
Gabriel
4
@ Gabriel maka itu harus dibuat jelas dalam jawaban apa ini sebenarnya.
21

Kami dapat memeriksa dengan 2 fungsi bawaan

os.path.isdir("directory")

Ini akan memberikan boolean true direktori yang ditentukan tersedia.

os.path.exists("directoryorfile")

Ini akan memberikan boolead true jika direktori atau file yang ditentukan tersedia.

Untuk memeriksa apakah path adalah direktori;

os.path.isdir("directorypath")

akan memberikan boolean true jika pathnya adalah direktori

Vivek Ananthan
sumber
2
Ini sepenuhnya berlebihan dengan jawaban yang lebih tua dan paling atas.
Davis Herring
10

Seperti dalam:

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

Mungkin melemparkan os.path.isdir(...)untuk memastikan.

AlG
sumber
10

Hanya untuk menyediakan os.statversi (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
Tyler A.
sumber
7

os memberi Anda banyak kemampuan ini:

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

listdir akan mengeluarkan pengecualian jika jalur input tidak valid.

dputros
sumber
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')
JoboFive
sumber
6
python memiliki fungsi builtin untuk membuat direktori, jadi lebih baik gunakan os.makedirs('mydir')daripadaos.system(...)
gizzmole
9
Anda mencetak bahwa 'direktori baru telah dibuat' tetapi Anda tidak tahu itu. Bagaimana jika Anda tidak memiliki izin untuk membuat direktori? Anda akan mencetak 'direktori baru telah dibuat' tetapi itu tidak benar. Apakah itu.
Wojciech Jakubas
4

Ada Unipathmodul yang nyaman .

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

Hal-hal terkait lainnya yang mungkin Anda butuhkan:

>>> 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

Anda dapat menginstalnya menggunakan pip:

$ pip3 install unipath

Ini mirip dengan built-in pathlib. Perbedaannya adalah bahwa ia memperlakukan setiap jalur sebagai string ( Pathadalah subkelas dari str), jadi jika beberapa fungsi mengharapkan string, Anda dapat dengan mudah memberikannya Pathobjek tanpa perlu mengubahnya menjadi string.

Sebagai contoh, ini berfungsi baik dengan Django dan settings.py:

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

Anda mungkin juga ingin membuat direktori jika tidak ada di sana.

Sumber , jika masih ada di SO.

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

Pada Python ≥ 3.5, gunakan pathlib.Path.mkdir:

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

Untuk versi Python yang lebih lama, saya melihat dua jawaban dengan kualitas yang bagus, masing-masing dengan cacat kecil, jadi saya akan berikan pendapat saya:

Coba os.path.exists, dan pertimbangkan os.makedirsuntuk penciptaan.

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

Seperti disebutkan dalam komentar dan di tempat lain, ada kondisi balapan - jika direktori dibuat antara os.path.existsdan os.makedirspanggilan, os.makedirsakan gagal dengan OSError. Sayangnya, blanket-catching OSErrordan continue tidak mudah, karena akan mengabaikan kegagalan untuk membuat direktori karena faktor lain, seperti izin yang tidak mencukupi, disk penuh, dll.

Salah satu opsi adalah untuk menjebak OSErrordan memeriksa kode kesalahan tertanam (lihat Apakah ada cara lintas platform untuk mendapatkan informasi dari OSError Python ):

import os, errno

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

Atau, mungkin ada yang kedua os.path.exists, tapi anggap yang lain membuat direktori setelah cek pertama, lalu menghapusnya sebelum yang kedua - kita masih bisa tertipu.

Tergantung pada aplikasinya, bahaya operasi bersamaan mungkin lebih atau kurang dari bahaya yang ditimbulkan oleh faktor-faktor lain seperti izin file. Pengembang harus mengetahui lebih banyak tentang aplikasi tertentu yang sedang dikembangkan dan lingkungan yang diharapkan sebelum memilih suatu implementasi.

Versi modern Python meningkatkan sedikit kode ini, baik dengan mengekspos FileExistsError(dalam 3.3 +) ...

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

... dan dengan mengizinkan argumen kata kunci os.makedirsdipanggilexist_ok (dalam 3.2+).

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

Dua hal

  1. periksa apakah direktori ada?
  2. jika tidak, buat direktori (opsional).
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")
Uday Kiran
sumber