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"))
@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.
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 importPathIn[2]: p =Path('/usr')In[3]: p.exists()Out[3]:TrueIn[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]:TrueIn[8]: q.is_dir()Out[8]:False
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
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.
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:
from pathlib importPathPath("/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:
import os
ifnot 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.
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 +) ...
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
sebaliknya, untuk melihat apakah direktori keduanya ada dan merupakan direktori pada saat yang sama.os.stat
untuk memberitahu direktori dari file. Itu memunculkanOSError
ketika path tidak valid, tidak peduli apakah itu file atau direktori. Juga, kode apa pun setelah pengecekan juga rentan terhadap kondisi balapan.Jawaban:
Anda sedang mencari
os.path.isdir
, atauos.path.exists
jika Anda tidak peduli apakah itu file atau direktori.Contoh:
sumber
existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
map
, tetapi dalam kasus umum, Anda memanggil fungsi dengan argumen dan tanda kurung. Juga, ada beberapa kesalahan ketik pada contoh Anda. mungkin maksudmufilter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])
.os.path.isfile(path)
jika Anda hanya peduli apakah itu file.Sangat dekat!
os.path.isdir
kembaliTrue
jika Anda memasukkan nama direktori yang saat ini ada. Jika tidak ada atau itu bukan direktori, maka itu kembaliFalse
.sumber
Python 3.4 diperkenalkan pada
pathlib
modul ke dalam perpustakaan standar, yang menyediakan pendekatan berorientasi objek untuk jalur menangani filesystem. Theis_dir()
danexists()
metode dariPath
objek dapat digunakan untuk menjawab pertanyaan:Jalur (dan string) dapat digabungkan bersama dengan
/
operator:Pathlib juga tersedia di Python 2.7 melalui modul pathlib2 di PyPi.
sumber
p / 'bin' / 'vim'
?Ya, gunakan
os.path.exists()
.sumber
os.path.isdir
akan mencapai itu.Kami dapat memeriksa dengan 2 fungsi bawaan
Ini akan memberikan boolean true direktori yang ditentukan tersedia.
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
sumber
Ya, gunakan os.path.isdir (path)
sumber
Seperti dalam:
Mungkin melemparkan
os.path.isdir(...)
untuk memastikan.sumber
Hanya untuk menyediakan
os.stat
versi (python 2):sumber
os memberi Anda banyak kemampuan ini:
listdir akan mengeluarkan pengecualian jika jalur input tidak valid.
sumber
sumber
os.makedirs('mydir')
daripadaos.system(...)
Ada
Unipath
modul yang nyaman .Hal-hal terkait lainnya yang mungkin Anda butuhkan:
Anda dapat menginstalnya menggunakan pip:
Ini mirip dengan built-in
pathlib
. Perbedaannya adalah bahwa ia memperlakukan setiap jalur sebagai string (Path
adalah subkelas daristr
), jadi jika beberapa fungsi mengharapkan string, Anda dapat dengan mudah memberikannyaPath
objek tanpa perlu mengubahnya menjadi string.Sebagai contoh, ini berfungsi baik dengan Django dan
settings.py
:sumber
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
: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 pertimbangkanos.makedirs
untuk penciptaan.Seperti disebutkan dalam komentar dan di tempat lain, ada kondisi balapan - jika direktori dibuat antara
os.path.exists
danos.makedirs
panggilan,os.makedirs
akan gagal denganOSError
. Sayangnya, blanket-catchingOSError
dan 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
OSError
dan memeriksa kode kesalahan tertanam (lihat Apakah ada cara lintas platform untuk mendapatkan informasi dari OSError Python ):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 +) ...... dan dengan mengizinkan argumen kata kunci
os.makedirs
dipanggilexist_ok
(dalam 3.2+).sumber
Dua hal
sumber