Saya sedang menulis skrip yang turun ke pohon direktori (menggunakan os.walk ()) dan kemudian mengunjungi setiap file yang cocok dengan ekstensi file tertentu. Namun, karena beberapa pohon direktori tempat alat saya akan digunakan juga mengandung sub direktori yang pada gilirannya mengandung BANYAK hal yang tidak berguna (untuk tujuan skrip ini), saya pikir saya akan menambahkan opsi bagi pengguna untuk menentukan daftar direktori untuk dikecualikan dari traversal.
Ini cukup mudah dengan os.walk (). Setelah semua, terserah saya untuk memutuskan apakah saya benar-benar ingin mengunjungi masing-masing file / dir yang dihasilkan oleh os.walk () atau hanya melewatkannya. Masalahnya adalah jika saya memiliki, misalnya, pohon direktori seperti ini:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
dan saya ingin mengecualikanStuff yang tidak berguna dan semua anak-anaknya, os.walk () masih akan turun ke semua (berpotensi ribuan) sub direktori dari Stuff yang tidak berguna , yang, tentu saja, banyak memperlambat segalanya. Dalam dunia yang ideal, saya bisa mengatakan os.walk () untuk tidak repot-repot menghasilkan anak lagi dari Stuff yang tidak berguna , tetapi setahu saya tidak ada cara untuk melakukan itu (ada?).
Adakah yang punya ide? Mungkin ada perpustakaan pihak ketiga yang menyediakan sesuatu seperti itu?
dirs[:] =
?dirs[:] = value
memodifikasidirs
di tempat . Ini mengubah isi daftardirs
tanpa mengubah wadah. Seperti yanghelp(os.walk)
disebutkan, ini diperlukan jika Anda ingin memengaruhi caraos.walk
melintasi subdirektori. (dirs = value
hanya menetapkan ulang (atau "mengikat") variabeldirs
ke daftar baru, tanpa mengubah yang aslidirs
.)filter()
:dirs[:] = list(filter(lambda x: not x in exclude, dirs))
os.walk
dan menghasilkanroot, dirs, files
setelah mengecualikan.git
(atau apa pun yang Anda inginkan) daridirs
.... bentuk alternatif jawaban luar biasa @ unutbu yang membaca sedikit lebih langsung, mengingat tujuannya adalah untuk mengecualikan direktori, dengan biaya O (n ** 2) vs O (n) waktu.
(Membuat salinan daftar dir dengan
list(dirs)
diperlukan untuk eksekusi yang benar)sumber
dirs[:] = set(dirs) - exclude
. Setidaknya masih \ $ O (n) \ $ dan Anda tidak membangun pemahaman hanya untuk efek sampingnya ...for d in list(dirs)
agak aneh.dirs
sudah menjadi daftar. Dan apa yang Anda miliki sebenarnya bukan daftar pemahaman.dirs.remove(d)
tidak mengembalikan apa pun, sehingga Anda berakhir dengan daftar penuhNone
s. Saya setuju dengan @Torsten.