Apakah ada cara untuk mengembalikan daftar semua subdirektori dalam direktori saat ini dengan Python?
Saya tahu Anda bisa melakukan ini dengan file, tetapi saya harus mendapatkan daftar direktori sebagai gantinya.
python
directory
subdirectory
Brad Zeis
sumber
sumber
Jawaban:
Apakah maksud Anda subdirektori langsung, atau setiap direktori di bawah pohon?
Apa pun itu, Anda dapat menggunakannya
os.walk
untuk melakukan ini:akan menghasilkan tuple untuk setiap subdirektori. Entri pertama dalam 3-tuple adalah nama direktori, jadi
seharusnya memberi Anda semua subdirektori, secara rekursif.
Perhatikan bahwa entri kedua dalam tuple adalah daftar direktori anak dari entri di posisi pertama, jadi Anda bisa menggunakan ini sebagai gantinya, tetapi sepertinya tidak akan banyak menghemat.
Namun, Anda bisa menggunakannya hanya untuk memberi Anda direktori anak langsung:
Atau lihat solusi lain yang sudah diposting, menggunakan
os.listdir
danos.path.isdir
, termasuk yang ada di " Cara mendapatkan semua subdirektori langsung dengan Python ".sumber
os.walk('.').next()[1]
atauos.walk('.').__next__()[1]
langsung. Sebagai gantinya, gunakan fungsi bawaannext()
, yang tersedia baik dalam Python 2 (lihat doc) dan Python 3 (lihat doc) . Sebagai contoh:next(os.walk('.'))[1]
.os.walk('.').next()[1]
secara langsung?iteraror.__next__()
merupakan metode internal daniterator.next()
penggunaan harus dialihkan ke bawaannext()
menurut PEP-3114. Lihat PEP-3114 yang disetujui pada 2007.os.walk
danos.listdir
+os.path.isdir
solusi: Saya baru saja menguji pada direktori dengan 10.000 subdirektori (dengan jutaan file dalam hierarki di bawah) dan perbedaan kinerja dapat diabaikan.os.walk
: "10 loop, terbaik 3: 44,6 msec per loop" danos.listdir
+os.path.isdir
: "10 loop, terbaik dari 3: 45,1 msec per loop"sumber
os.path.join
ono
untuk mendapatkan path lengkap, jika tidakisdir(0)
akan selalu kembali salahos.path.join
dua kali, Anda dapat bergabung terlebih dahulu dan kemudian menyaring daftar menggunakanos.path.isdir
:filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
Anda bisa menggunakannya
glob.glob
Jangan lupa jejak
/
setelah*
.sumber
/
/
sebagai pemisah folder, lakukan ini:glob(os.path.join(path_to_directory, "*", ""))
recursive=True
Jauh lebih bagus daripada yang di atas, karena Anda tidak perlu beberapa os.path.join () dan Anda akan mendapatkan path lengkap secara langsung (jika Anda mau), Anda dapat melakukan ini dengan Python 3.5 dan lebih tinggi.
Ini akan memberikan path lengkap ke subdirektori. Jika Anda hanya ingin menggunakan nama subdirektori
f.name
daripadaf.path
https://docs.python.org/3/library/os.html#os.scandir
Sedikit Sl: Jika Anda membutuhkan semua subfolder secara rekursif dan / atau semua file secara rekursif , lihat fungsi ini, yang lebih cepat dari
os.walk
&glob
dan akan mengembalikan daftar semua subfolder serta semua file di dalam subfolder (sub-): https://stackoverflow.com/a/59803793/2441026Jika Anda hanya menginginkan semua subfolder secara rekursif :
Mengembalikan daftar semua subfolder dengan jalur lengkapnya. Ini lagi lebih cepat daripada
os.walk
dan jauh lebih cepat daripadaglob
.Analisis semua fungsi
tl; dr:
- Jika Anda ingin mendapatkan semua subdirektori langsung untuk penggunaan folder
os.scandir
.- Jika Anda ingin mendapatkan semua subdirektori, bahkan yang bersarang , gunakan
os.walk
atau - sedikit lebih cepat -fast_scandir
fungsi di atas.- Jangan pernah gunakan
os.walk
hanya untuk subdirektori tingkat atas, karena bisa jadi ratusan (!) Kali lebih lambat daripadaos.scandir
.os.walk
akan menjadi folder dasar. Jadi, Anda tidak hanya akan mendapatkan subdirektori. Anda dapat menggunakannyafu.pop(0)
untuk menghapusnya.Hasil :
Diuji dengan W7x64, Python 3.8.1.
sumber
Jika Anda membutuhkan solusi rekursif yang akan menemukan semua subdirektori di subdirektori, gunakan walk seperti yang disarankan sebelumnya.
Jika Anda hanya perlu direktori anak direktori saat ini, gabungkan
os.listdir
denganos.path.isdir
sumber
Saya lebih suka menggunakan filter ( https://docs.python.org/2/library/functions.html#filter ), tetapi ini hanya masalah selera.
sumber
Diimplementasikan ini menggunakan python-os-walk. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )
sumber
Anda bisa mendapatkan daftar subdirektori (dan file) di Python 2.7 menggunakan os.listdir (path)
sumber
os.listdir
daftar isi direktori termasuk file.Hanya Mendaftar direktori
Cantumkan hanya file dalam direktori saat ini
sumber
Python 3.4 diperkenalkan pada
pathlib
modul ke dalam perpustakaan standar, yang menyediakan pendekatan berorientasi objek untuk jalur menangani filesystem:Pathlib juga tersedia di Python 2.7 melalui modul pathlib2 di PyPi.
sumber
for f in filter(Path.is_dir, p.iterdir()):
Karena saya menemukan masalah ini menggunakan jalur Python 3.4 dan Windows UNC, inilah varian untuk lingkungan ini:
Pathlib baru di Python 3.4 dan membuat bekerja dengan jalur di bawah berbagai OS jauh lebih mudah: https://docs.python.org/3.4/library/pathlib.html
sumber
Meskipun pertanyaan ini dijawab sejak lama. Saya ingin merekomendasikan untuk menggunakan
pathlib
modul ini karena ini adalah cara yang kuat untuk bekerja pada Windows dan Unix OS.Jadi untuk mendapatkan semua jalur dalam direktori tertentu termasuk subdirektori:
dll.
sumber
Terima kasih untuk tipsnya, kawan. Saya mengalami masalah dengan softlink (rekursi tak terbatas) yang dikembalikan sebagai dir. Softlink? Kami tidak ingin ada tautan lunak yang menyebalkan! Begitu...
Ini hanya menghasilkan dir, bukan softlink:
sumber
[x[0] for x in inf]
disebut dengan python sehingga saya bisa mencarinya?Copy paste friendly di
ipython
:Output dari
print(folders)
:sumber
x
adalah item dari daftar yang dibuat olehos.listdir(d)
karenalistdir
akan mengembalikan file dan folder yang dia gunakan denganfilter
perintahos.path.isdir
untuk menyaring file apa pun dari daftar.Beginilah cara saya melakukannya.
sumber
Berikut adalah beberapa fungsi sederhana berdasarkan contoh @Blair Conrad -
sumber
Membangun solusi Eli Bendersky, gunakan contoh berikut:
di mana
<your_directory>
jalur ke direktori yang ingin Anda lintasi.sumber
Jalur jalan yang penuh dan akuntansi untuk jalur makhluk
.
,..
,\\
,..\\..\\subfolder
, dll:sumber
Jawaban ini sepertinya belum ada.
sumber
Saya punya pertanyaan serupa baru-baru ini, dan saya menemukan bahwa jawaban terbaik untuk python 3.6 (seperti yang ditambahkan pengguna havlock) adalah menggunakan
os.scandir
. Karena sepertinya tidak ada solusi menggunakannya, saya akan menambahkan sendiri. Pertama, solusi non-rekursif yang hanya mencantumkan subdirektori langsung di bawah direktori root.Versi rekursif akan terlihat seperti ini:
perlu diingat bahwa
entry.path
memegang jalur absolut ke subdirektori. Jika Anda hanya perlu nama folder, Anda dapat menggunakannyaentry.name
. Lihat os.DirEntry untuk detail tambahan tentangentry
objek.sumber
gunakan fungsi filter
os.path.isdir
atasos.listdir()
sesuatu seperti inifilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
sumber
Ini akan mencantumkan semua subdirektori di bawah pohon file.
pathlib
baru dalam versi 3.4sumber
Berfungsi untuk mengembalikan Daftar semua subdirektori dalam jalur file yang diberikan. Akan mencari melalui seluruh pohon file.
sumber
kita bisa mendapatkan daftar semua folder dengan menggunakan os.walk ()
pathObject ini adalah objek dan kita bisa mendapatkan array dengan
Kita bisa mendapatkan daftar semua subdirektori dengan mengulangi melalui arr dan mencetak array tengah
Ini akan mencetak semua subdirektori.
Untuk mendapatkan semua file:
sumber
Fungsi ini, dengan orangtua yang diberikan
directory
iterates atas semua secaradirectories
rekursif danprints
semuafilenames
yang ditemukan di dalamnya. Terlalu bergunasumber
Dengan bergabung dengan beberapa solusi dari sini, inilah yang akhirnya saya gunakan:
sumber