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
topdown
adalahTrue
, pemanggil dapat memodifikasi daftar dirname di tempat (mungkin menggunakandel
atau 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.