Python 3.5+
Karena Anda menggunakan python baru, Anda harus menggunakan pathlib.Path.rglob
dari pathlib
modul.
from pathlib import Path
for path in Path('src').rglob('*.c'):
print(path.name)
Jika Anda tidak ingin menggunakan pathlib, gunakan saja glob.glob
, tetapi jangan lupa untuk memasukkan recursive
parameter kata kunci.
Untuk kasus di mana file yang cocok dimulai dengan titik (.); seperti file di direktori saat ini atau file tersembunyi di sistem berbasis Unix, gunakan os.walk
solusi di bawah ini.
Versi Python yang lebih lama
Untuk versi Python yang lebih lama, gunakan os.walk
untuk menjalankan direktori secara rekursif dan fnmatch.filter
mencocokkan dengan ekspresi sederhana:
import fnmatch
import os
matches = []
for root, dirnames, filenames in os.walk('src'):
for filename in fnmatch.filter(filenames, '*.c'):
matches.append(os.path.join(root, filename))
os.path.walk()
yang sedikit lebih fiddly untuk digunakan daripadaos.walk()
os.path.walk()
itu sudah usang dan telah dihapus dengan Python 3.pathlib.Path('src').glob('**/*.c')
harus berfungsi.Mirip dengan solusi lain, tetapi menggunakan fnmatch.fnmatch bukan glob, karena os.walk sudah mendaftarkan nama file:
Juga, menggunakan generator memungkinkan Anda untuk memproses setiap file seperti yang ditemukan, alih-alih menemukan semua file dan kemudian memprosesnya.
sumber
reduce(lambda x, y: x+y, map(lambda (r,_,x):map(lambda f: r+'/'+f, filter(lambda f: fnmatch.fnmatch(f, pattern), x)), os.walk('src/webapp/test_scripts')))
(os.path.join(root,filename) for root, dirs, files in os.walk(directory) for filename in files if fnmatch.fnmatch(filename, pattern))
Saya telah memodifikasi modul glob untuk mendukung ** untuk globbing rekursif, misalnya:
https://github.com/miracle2k/python-glob2/
Berguna saat Anda ingin memberi pengguna Anda kemampuan untuk menggunakan sintaks **, dan dengan demikian os.walk () saja tidak cukup baik.
sumber
**
modul glob resmi, lakukan:glob(path, recursive=True)
Dimulai dengan Python 3.4, seseorang dapat menggunakan
glob()
metode salah satuPath
kelas dalam modul pathlib baru , yang mendukung**
wildcard. Sebagai contoh:Pembaruan: Dimulai dengan Python 3.5, sintaks yang sama juga didukung oleh
glob.glob()
.sumber
fnmatch
memberi Anda pola yang persis samaglob
, jadi ini benar-benar pengganti yang sangat baik untukglob.glob
semantik yang sangat dekat. Versi berulang (misalnya generator), IOW penggantiglob.iglob
, adalah adaptasi sepele (hanyayield
hasil antara saat Anda pergi, alih-alihextend
daftar hasil tunggal untuk kembali di akhir).sumber
recursive_glob(pattern, treeroot='.')
seperti yang saya sarankan di edit saya? Dengan cara ini, dapat disebut misalnyarecursive_glob('*.txt')
dan secara intuitif cocok dengan sintaksisglob
.fnmatch.filter
, yang kira-kira sama bermanfaatnya dengan kemungkinan mencocokkan argumen tunggalglob.glob
.Untuk python> = 3,5 Anda dapat menggunakan
**
,recursive=True
:Demo
sumber
Anda ingin menggunakan
os.walk
untuk mengumpulkan nama file yang sesuai dengan kriteria Anda. Sebagai contoh:sumber
Berikut ini solusi dengan pemahaman daftar bersarang,
os.walk
dan pencocokan akhiran sederhana alih-alihglob
:Itu dapat dikompres menjadi satu-liner:
atau digeneralisasi sebagai fungsi:
Jika Anda membutuhkan
glob
pola gaya penuh , Anda dapat mengikuti contoh Alex dan Bruno dan menggunakanfnmatch
:sumber
Baru-baru ini saya harus memulihkan gambar saya dengan ekstensi .jpg. Saya menjalankan photorec dan memulihkan 4579 direktori dalam 2,2 juta file di dalamnya, memiliki beragam ekstensi yang luar biasa. Dengan skrip di bawah ini saya dapat memilih 50133 file dengan ekstensi .jpg dalam beberapa menit:
sumber
Pertimbangkan
pathlib.rglob()
.Lihat juga pos terkait @ taleinat di sini dan pos serupa di tempat lain.
sumber
Johan dan Bruno memberikan solusi luar biasa pada persyaratan minimal seperti yang dinyatakan. Saya baru saja merilis Formic yang mengimplementasikan Ant FileSet dan Glob yang dapat menangani ini dan skenario yang lebih rumit. Implementasi dari kebutuhan Anda adalah:
sumber
berdasarkan jawaban lain ini adalah implementasi kerja saya saat ini, yang mengambil file xml bersarang di direktori root:
Saya benar-benar bersenang-senang dengan python :)
sumber
Cara lain untuk melakukannya hanya dengan menggunakan modul glob. Cukup seed metode rglob dengan direktori basis awal dan pola untuk mencocokkan dan itu akan mengembalikan daftar nama file yang cocok.
sumber
Untuk python 3.5 dan yang lebih baru
lebih lanjut Anda mungkin perlu
sumber
/**
itu bekerja untuk saya, seperti itu:file_names_array = glob.glob('src/**/*.c', recursive=True)
Atau dengan pemahaman daftar:
sumber
Baru saja membuat ini .. itu akan mencetak file dan direktori dengan cara hierarkis
Tapi saya tidak menggunakan fnmatch atau berjalan
sumber
Yang itu menggunakan fnmatch atau ekspresi reguler:
sumber
Selain jawaban yang disarankan, Anda dapat melakukan ini dengan beberapa generasi malas dan sihir pemahaman daftar:
Selain pas dalam satu baris dan menghindari daftar yang tidak perlu dalam memori, ini juga memiliki efek samping yang bagus, yang dapat Anda gunakan dengan cara yang mirip dengan operator **, misalnya, Anda dapat menggunakan
os.path.join(root, 'some/path/*.c')
untuk mendapatkan semua file .c di semua sub direktori src yang memiliki struktur ini.sumber
Ini adalah kode yang berfungsi pada Python 2.7. Sebagai bagian dari pekerjaan devops saya, saya diminta untuk menulis skrip yang akan memindahkan file konfigurasi yang ditandai dengan live-appName.properties ke appName.properties. Mungkin ada file ekstensi lain juga seperti live-appName.xml.
Di bawah ini adalah kode yang berfungsi untuk ini, yang menemukan file dalam direktori yang diberikan (level bersarang) dan kemudian mengganti nama (memindahkan) file tersebut ke nama file yang diperlukan
Fungsi ini dipanggil dari skrip utama
Semoga ini bisa membantu seseorang yang berjuang dengan masalah serupa.
sumber
Versi sederhana dari jawaban Johan Dahlin, tanpa fnmatch .
sumber
Berikut ini adalah solusi saya menggunakan pemahaman daftar untuk mencari beberapa ekstensi file secara rekursif dalam direktori dan semua subdirektori:
sumber
sumber
Saya mengubah jawaban teratas dalam posting ini .. dan baru-baru ini membuat skrip ini yang akan mengulang semua file dalam direktori tertentu (searchdir) dan sub-direktori di bawahnya ... dan mencetak nama file, rootdir, tanggal modifikasi / pembuatan, dan ukuran.
Semoga ini bisa membantu seseorang ... dan mereka bisa menjalankan direktori dan mendapatkan fileinfo.
sumber
Berikut adalah solusi yang akan cocok dengan pola terhadap path lengkap dan bukan hanya nama file dasar.
Itu menggunakan
fnmatch.translate
untuk mengubah pola gabus menjadi ekspresi reguler, yang kemudian dicocokkan dengan path lengkap setiap file yang ditemukan saat berjalan direktori.re.IGNORECASE
bersifat opsional, tetapi diinginkan pada Windows karena sistem file itu sendiri tidak peka terhadap huruf besar-kecil. (Saya tidak repot-repot menyusun regex karena dokumen menunjukkan itu harus di-cache secara internal.)sumber
Saya membutuhkan solusi untuk python 2.x yang bekerja cepat di direktori besar.
Saya berakhir dengan ini:
Perhatikan bahwa Anda mungkin memerlukan penanganan pengecualian jika
ls
tidak menemukan file yang cocok.sumber
ls src/**/*.c
hanya berfungsi jika opsi globstar diaktifkan (shopt -s globstar
) - lihat jawaban ini untuk detailnya.