Saya memiliki file yang mungkin berada di tempat yang berbeda pada mesin setiap pengguna. Apakah ada cara untuk mengimplementasikan pencarian file? Sebuah cara agar saya dapat mengirimkan nama file dan pohon direktori untuk mencari?
110
Jawaban:
os.walk adalah jawabannya, ini akan menemukan pertandingan pertama:
Dan ini akan menemukan semua kecocokan:
Dan ini akan cocok dengan pola:
sumber
if name in file or name in dirs
for name in files:
akan gagal mencarisuper-photo.jpg
saat beradasuper-photo.JPG
di sistem file. (satu jam dalam hidup saya, saya ingin kembali ;-) Perbaikan yang agak berantakan adalahif str.lower(name) in [x.lower() for x in files]
Saya menggunakan versi
os.walk
dan pada direktori yang lebih besar mendapat waktu sekitar 3,5 detik. Saya mencoba dua solusi acak tanpa peningkatan yang berarti, lalu baru saja melakukannya:Meskipun hanya untuk POSIX, saya mendapat 0,25 detik.
Dari sini, saya yakin sangat mungkin untuk banyak mengoptimalkan pencarian secara keseluruhan dengan cara yang tidak bergantung platform, tetapi di sinilah saya menghentikan penelitian.
sumber
Jika Anda menggunakan Python di Ubuntu dan Anda hanya ingin Python bekerja di Ubuntu, cara yang jauh lebih cepat adalah menggunakan program terminal
locate
seperti ini.search_results
adalah salahlist
satu jalur file absolut. Ini 10.000 kali lebih cepat daripada metode di atas dan untuk satu pencarian yang saya lakukan ~ 72.000 kali lebih cepat.sumber
Di Python 3.4 atau yang lebih baru, Anda dapat menggunakan pathlib untuk melakukan globbing rekursif:
Referensi: https://docs.python.org/3/library/pathlib.html#pathlib.Path.glob
Di Python 3.5 atau yang lebih baru, Anda juga dapat melakukan globbing rekursif seperti ini:
Referensi: https://docs.python.org/3/library/glob.html#glob.glob
sumber
Untuk pencarian cepat dan tidak tergantung OS, gunakan
scandir
https://github.com/benhoyt/scandir/#readme
Baca http://bugs.python.org/issue11406 untuk detail alasannya.
sumber
scandir.walk()
sesuai jawaban @ Nadia. Perhatikan bahwa jika Anda menggunakan Python 3.5+,os.walk()
memiliki ekstensiscandir.walk()
kecepatan. Juga, PEP 471 mungkin merupakan dokumen yang lebih baik untuk dibaca sebagai info daripada masalah itu.Jika Anda bekerja dengan Python 2, Anda memiliki masalah dengan rekursi tak terbatas pada windows yang disebabkan oleh symlink yang merujuk sendiri.
Skrip ini akan menghindari mengikuti itu. Perhatikan bahwa ini khusus untuk jendela !
Ini mengembalikan daftar dengan semua jalur yang mengarah ke file dalam daftar nama file. Pemakaian:
sumber
Di bawah ini kami menggunakan argumen boolean "pertama" untuk beralih antara kecocokan pertama dan semua kecocokan (default yang setara dengan "temukan. -Name file"):
sumber
Jawabannya sangat mirip dengan yang sudah ada, tetapi sedikit dioptimalkan.
Jadi Anda dapat menemukan file atau folder apa pun berdasarkan pola:
baik dengan substring:
atau menggunakan predikat:
untuk mencari hanya file atau folder saja - ganti “dirs + files”, misalnya, dengan hanya “dirs” atau hanya “files”, tergantung pada apa yang Anda butuhkan.
Salam.
sumber
Jawaban SARose berfungsi untuk saya sampai saya memperbarui dari Ubuntu 20.04 LTS. Sedikit perubahan yang saya buat pada kodenya membuatnya berfungsi pada rilis Ubuntu terbaru.
sumber