GNU/Linux >> Belajar Linux >  >> Linux

os.walk tanpa folder tersembunyi

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 adalah True , pemanggil dapat memodifikasi daftar dirname di tempat (mungkin menggunakan del atau penugasan slice), dan walk() 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 menginformasikan walk() tentang direktori yang dibuat atau diganti namanya oleh pemanggil sebelum melanjutkan walk() lagi.


Linux
  1. Pwd Tanpa Symlink?

  2. Menggabungkan Folder Dengan Mv?

  3. Tempel File Tanpa Pembatas?

  1. Mv Menimpa File Hanya-Baca Tanpa Diminta?

  2. Ubah Kata Sandi Root Dengan Sudo, Tanpa Su?

  3. Daftar direktori tanpa garis miring /

  1. cp -r tanpa file tersembunyi

  2. Kemungkinan:sudo tanpa kata sandi

  3. Bash:ls * tanpa pengelompokan folder