Saya menyadari itu tidak ditanyakan dalam pertanyaan, tetapi saya memiliki masalah serupa di mana saya ingin mengecualikan file tersembunyi dan file yang dimulai dengan __ , khususnya __pycache__ direktori. Saya mendapatkan pertanyaan ini karena saya mencoba mencari tahu mengapa pemahaman daftar saya tidak melakukan apa yang saya harapkan. Saya tidak memodifikasi daftar dengan dirnames[:] .
Saya membuat daftar awalan yang ingin saya kecualikan dan memodifikasi dirname di tempat seperti ini:
exclude_prefixes = ('__', '.') # exclusion prefixes
for dirpath, dirnames, filenames in os.walk(node):
# exclude all dirs starting with exclude_prefixes
dirnames[:] = [dirname
for dirname in dirnames
if not dirname.startswith(exclude_prefixes)]
Kasus penggunaan saya mirip dengan OP, kecuali saya ingin mengembalikan jumlah total sub-direktori di dalam folder tertentu. Dalam kasus saya, saya ingin menghilangkan sub-direktori bernama .git (serta folder apa pun yang mungkin bersarang di dalam .git ini folder).
Di Python 3.6.7, saya menemukan bahwa pendekatan jawaban yang diterima tidak berhasil -- itu menghitung semua .git folder dan sub-foldernya. Inilah yang berhasil bagi saya:
num_local_subdir = 0
for root, dirs, files in os.walk(local_folder_path):
if '.git' in dirs:
dirs.remove('.git')
num_local_subdir += (len(dirs))
Tidak, tidak ada opsi untuk os.walk() yang akan melewatkan itu. Anda harus melakukannya sendiri (yang cukup mudah):
for root, dirs, files in os.walk(path):
files = [f for f in files if not f[0] == '.']
dirs[:] = [d for d in dirs if not d[0] == '.']
# use files and dirs
Perhatikan dirs[:] = tugas irisan; os.walk secara rekursif melintasi subdirektori yang terdaftar di dirs . Dengan mengganti elemen dari dirs dengan yang memenuhi kriteria (misalnya, direktori yang namanya tidak dimulai dengan . ), os.walk() tidak akan mengunjungi direktori yang gagal memenuhi kriteria.
Ini hanya berfungsi jika Anda menyimpan topdown argumen kata kunci ke True , dari dokumentasi os.walk() :
Ketika
topdownadalahTrue, pemanggil dapat memodifikasi daftar dirname di tempat (mungkin menggunakandelatau penugasan slice), danwalk()hanya akan muncul kembali ke subdirektori yang namanya tetap berada di dirnames; ini dapat digunakan untuk memangkas pencarian, memaksakan urutan kunjungan tertentu, atau bahkan untuk menginformasikanwalk()tentang direktori yang dibuat atau diganti namanya oleh pemanggil sebelum melanjutkanwalk()lagi.