Saya sedang mengerjakan skrip untuk secara rekursif menelusuri subfolder di folder utama dan membuat daftar dari jenis file tertentu. Saya mengalami masalah dengan skrip. Saat ini ditetapkan sebagai berikut
for root, subFolder, files in os.walk(PATH):
for item in files:
if item.endswith(".txt") :
fileNamePath = str(os.path.join(root,subFolder,item))
Masalahnya adalah bahwa variabel subFolder menarik daftar subfolder daripada folder tempat file ITEM berada. Saya berpikir untuk menjalankan perulangan for untuk subfolder sebelumnya dan bergabung dengan bagian pertama dari jalur tetapi saya pikir saya akan memeriksa ulang untuk melihat apakah ada yang punya saran sebelum itu. Terima kasih atas bantuan Anda!
rglob
ini tidak sensitif pada platform Windows - tetapi itu tidak sensitif secara portabel.glob
too (Python 3.6 here):glob.iglob(os.path.join(real_source_path, '**', '*.[xX][mM][lL]')
iglob
tidak bekerja untuk file di sub-sub folder atau di bawahnya. Anda perlu menambahkanrecursive=True
.glob.glob()
mendapat parameter rekursif baru .Jika Anda ingin mendapatkan setiap
.txt
file di bawahmy_path
(secara rekursif termasuk subdirektori):Jika Anda membutuhkan iterator, Anda dapat menggunakan iglob sebagai alternatif:
sumber
files = glob.glob(PATH + '/*/**/*.txt', recursive=True)
?Saya akan menerjemahkan pemahaman daftar John La Rooy menjadi bersarang, kalau-kalau ada orang lain yang kesulitan memahaminya.
Harus setara dengan:
Berikut dokumentasi untuk daftar pemahaman dan fungsi os.walk dan glob.glob .
sumber
glob.glob(..., recursive=True)
danlist(Path(dir).glob(...'))
tidak.Ini tampaknya menjadi solusi tercepat yang dapat saya temukan, dan lebih cepat daripada
os.walk
dan jauh lebih cepat daripadaglob
solusi apa pun .f.path
kef.name
(jangan ubah untuk subfolder!).Args:
dir: str, ext: list
.Fungsi mengembalikan dua daftar:
subfolders, files
.Lihat di bawah untuk analisis kecepatan rinci.
Analisis kecepatan
untuk berbagai metode untuk mendapatkan semua file dengan ekstensi file tertentu di dalam semua subfolder dan folder utama.
tl; dr:
-
fast_scandir
jelas menang dan dua kali lebih cepat dari semua solusi lainnya, kecuali os.walk.-
os.walk
Posisi kedua sedikit lebih lambat.- menggunakan
glob
akan sangat memperlambat proses.- Tidak ada hasil yang menggunakan pemilahan alami . Artinya, hasil akan diurutkan seperti ini: 1, 10, 2. Untuk mendapatkan penyortiran alami (1, 2, 10), lihat https://stackoverflow.com/a/48030307/2441026
Hasil:
Pengujian dilakukan dengan menjalankan W7x64, Python 3.8.1, 20. 16596 berkas dalam 439 subfolder (sebagian bersarang).
find_files
berasal dari https://stackoverflow.com/a/45646357/2441026 dan memungkinkan Anda mencari beberapa ekstensi.fast_scandir
ditulis sendiri dan juga akan mengembalikan daftar subfolder. Anda dapat memberikannya daftar ekstensi untuk dicari (saya menguji daftar dengan satu entri ke yang sederhanaif ... == ".jpg"
dan tidak ada perbedaan yang signifikan).sumber
pathlib
Perpustakaan baru menyederhanakan ini menjadi satu baris:Anda juga dapat menggunakan versi generator:
Ini mengembalikan
Path
objek, yang dapat Anda gunakan untuk hampir semua hal, atau mendapatkan nama file sebagai stringfile.name
.sumber
Ini bukan jawaban yang paling tajam, tapi saya akan menaruhnya di sini untuk bersenang-senang karena ini adalah pelajaran rekursi yang rapi
Di komputer saya, saya memiliki dua folder,
root
danroot2
Katakanlah saya ingin mencari semua
.txt
dan semua.mid
file di salah satu direktori ini, maka saya bisa melakukannyasumber
Rekursif baru di Python 3.5, jadi tidak akan berfungsi di Python 2.7. Berikut adalah contoh yang menggunakan
r
string sehingga Anda hanya perlu memberikan jalur seperti pada Win, Lin, ...Catatan: Ini akan mencantumkan semua file, tidak peduli seberapa dalam itu harus disimpan.
sumber
Anda dapat melakukannya dengan cara ini untuk mengembalikan Anda daftar file jalur absolut.
sumber
Jika Anda tidak keberatan memasang perpustakaan cahaya tambahan, Anda dapat melakukan ini:
Pemakaian:
Hasilnya akan terlihat seperti ini:
Ia bekerja pada Python 2.7 dan Python 3.
Github: https://github.com/kyzas/plazy#list-files
Penafian: Saya seorang penulis dari
plazy
.sumber
Fungsi ini hanya akan memasukkan file ke dalam daftar secara rekursif. Semoga ini bisa.
sumber
Solusi asli Anda hampir benar, tetapi variabel "root" diperbarui secara dinamis saat berada di sekitar jalur rekursif. os.walk () adalah generator rekursif. Setiap set tuple (root, subFolder, files) ditujukan untuk root tertentu seperti cara Anda mengaturnya.
yaitu
Saya membuat sedikit perubahan pada kode Anda untuk mencetak daftar lengkap.
Semoga ini membantu!
sumber