Saya mencoba untuk mendapatkan daftar file dalam direktori menggunakan Python, tetapi saya tidak ingin daftar SEMUA file.
Apa yang saya inginkan pada dasarnya adalah kemampuan untuk melakukan sesuatu seperti yang berikut tetapi menggunakan Python dan tidak mengeksekusi ls.
ls 145592*.jpg
Jika tidak ada metode bawaan untuk ini, saya saat ini sedang berpikir untuk menulis perulangan for untuk mengulangi hasil dari os.listdir()
dan untuk menambahkan semua file yang cocok ke daftar baru.
Namun, ada banyak file di direktori itu dan oleh karena itu saya berharap ada metode yang lebih efisien (atau metode bawaan).
Jawaban:
glob.glob('145592*.jpg')
sumber
glob.glob('145592*.jpg')
mencetak seluruh jalur absolut file sementarals 145592*.jpg
hanya mencetak daftar file.glob()
hanya menggunakan listdir + fnmatch, daripada panggilan sistem operasi khusus untuk melakukan penyaringan wildcard. Sebagai contoh, pada WindowsFindFirstFile
API memungkinkan Anda untuk menentukan wildcard sehingga OS melakukan penyaringan secara langsung, dan mungkin lebih efisien (saya tidak berpikir ada yang setara di Linux).glob.glob()
jelas merupakan cara untuk melakukannya (sesuai Ignacio). Namun, jika Anda membutuhkan pencocokan yang lebih rumit, Anda dapat melakukannya dengan pemahaman daftar danre.match()
, seperti:Lebih fleksibel, tetapi seperti yang Anda perhatikan, kurang efisien.
sumber
[0-9]+
[0123456789]
urutan ( lihat dokumen ), dan juga memilikifnmatch.filter()
fungsi yang membuat loop ini sedikit lebih efisien.Sederhana saja:
Saya lebih suka bentuk pemahaman daftar ini karena bacaannya baik dalam bahasa Inggris.
Saya membaca baris keempat sebagai: Untuk setiap fn di os.listdir untuk jalur saya, beri saya hanya yang cocok dengan salah satu ekstensi saya yang disertakan.
Mungkin sulit bagi programmer python pemula untuk benar-benar terbiasa menggunakan daftar pemahaman untuk penyaringan, dan dapat memiliki beberapa overhead memori untuk set data yang sangat besar, tetapi untuk daftar direktori dan tugas penyaringan string sederhana lainnya, daftar pemahaman mengarah ke lebih bersih kode yang dapat didokumentasikan.
Satu-satunya hal tentang desain ini adalah bahwa itu tidak melindungi Anda dari membuat kesalahan dengan melewatkan string daripada daftar. Misalnya, jika Anda secara tidak sengaja mengonversi string ke daftar dan berakhir dengan mengecek semua karakter string, Anda bisa mendapatkan banyak positif palsu.
Tetapi lebih baik memiliki masalah yang mudah diperbaiki daripada solusi yang sulit dimengerti.
sumber
any()
sini, karenastr.endswith()
mengambil urutan akhir.if fn.endswith(included_extentensions)
lebih dari cukup.str.endswith(seq)
Martijn menunjukkan, ini tidak benar, karena file harus diakhiri dengan.ext
itu untuk memiliki ekstensi itu. Kode ini juga akan menemukan (misalnya) file bernama "myjpg" atau direktori yang bernama "png". Untuk memperbaikinya, cukup awali setiap ekstensiincluded_extensions
dengan.
.included_extensions
vsincluded_extentsions
? Sayang sekali karena kalau tidak ini adalah jawaban yang saya sukai.Pilihan lain:
https://docs.python.org/3/library/fnmatch.html
sumber
glob
dilakukan pada satu baris.glob
mengembalikan path lengkap dan bukanos.listdir
hanya mengembalikan nama file. Setidaknya inilah yang terjadi pada Python 2.Filter dengan
glob
modul:Impor bola
Kartu Liar:
Ekstensi Fiter
.txt
:Satu karakter
Rentang angka
Alphabet Ranges
sumber
Kode awal
Solusi 1 - gunakan "glob"
Solusi 2 - gunakan "os" + "fnmatch"
Varian 2.1 - Pencarian dalam direktori saat ini
Varian 2.2 - Pencarian rekursif
Hasil
Solusi 3 - gunakan "pathlib"
Catatan:
sumber
gunakan os.walk untuk mendaftarkan file Anda secara rekursif
sumber
file.endswith(alist_filter)
cukup.Ini akan memberi Anda daftar file jpg dengan path lengkapnya. Anda dapat mengganti
x[0]+"/"+f
denganf
hanya untuk nama file. Anda juga dapat menggantif.endswith(".jpg")
dengan kondisi string apa pun yang Anda inginkan.sumber
Anda mungkin juga menyukai pendekatan tingkat tinggi (saya telah mengimplementasikan dan mengemasnya sebagai findtools ):
dapat diinstal dengan
sumber
Nama file dengan ekstensi "jpg" dan "png" di "path / ke / gambar":
sumber
Anda dapat menggunakan pathlib yang tersedia di pustaka standar Python 3.4 dan di atasnya.
sumber
Anda dapat menentukan pola dan memeriksanya. Di sini saya telah mengambil kedua pola awal dan akhir dan mencari mereka dalam nama file. FILES berisi daftar semua file dalam direktori.
sumber
Bagaimana dengan str.split ()? Tidak ada yang diimpor.
sumber
f.endswith('.jpg')
(tetapi juga akan memilihfilename.jpg.ext
)Anda dapat menggunakan subprocess.check_ouput () sebagai
Tentu saja, string di antara tanda kutip dapat berupa apa pun yang ingin Anda jalankan di shell, dan menyimpan hasilnya.
sumber
ls
Output tidak boleh diuraikan .