Saya ingin membuka serangkaian subfolder dalam sebuah folder dan menemukan beberapa file teks dan mencetak beberapa baris file teks tersebut. Saya menggunakan ini:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Tetapi ini juga tidak dapat mengakses subfolder. Adakah yang tahu bagaimana saya dapat menggunakan perintah yang sama untuk mengakses subfolder juga?
python
filesystems
glob
fnmatch
UserYmY
sumber
sumber
Jawaban:
Di Python 3.5 dan yang lebih baru, gunakan
**/
fungsi rekursif baru :Saat
recursive
disetel,**
diikuti dengan pemisah jalur yang cocok dengan 0 atau lebih subdirektori.Dalam versi Python sebelumnya,
glob.glob()
tidak dapat mencantumkan file di subdirektori secara rekursif.Dalam hal ini saya akan menggunakan
os.walk()
kombinasi denganfnmatch.filter()
:Ini akan menjalankan direktori Anda secara rekursif dan mengembalikan semua nama jalur absolut ke
.txt
file yang cocok . Dalam kasus khusus ini yangfnmatch.filter()
mungkin berlebihan, Anda juga bisa menggunakan.endswith()
tes:sumber
path to directory
.recursive=False
bersama dengan**/
fungsionalitas tidak menyediakan daftar file hanya di folder tertentu, melainkan di anak-anaknya?**/
memberikan daftar nama direktori di direktori kerja saat ini, karena polanya diakhiri/
, dan denganrecursive=False
Anda pada dasarnya memiliki ganda*
, yang cocok sama*/
, hanya kurang efisien.*/*
jika Anda membutuhkan semua file di semua subdirektori.Untuk menemukan file di subdirektori langsung:
Untuk versi rekursif yang melintasi semua subdirektori, Anda dapat menggunakan
**
dan meneruskanrecursive=True
sejak Python 3.5 :Kedua panggilan fungsi mengembalikan daftar. Anda bisa menggunakan
glob.iglob()
untuk mengembalikan jalur satu per satu. Atau gunakanpathlib
:Kedua metode mengembalikan iterator (Anda bisa mendapatkan jalur satu per satu).
sumber
glob()
untuk mendukung pola dalam direktori.**
kasus rekursi. Tetapi untuk**
bekerja, Anda harus mengaturrecursion=True
sakelar, btw.Ada banyak kebingungan tentang topik ini. Biarkan saya melihat apakah saya dapat menjelaskannya (Python 3.7):
glob.glob('*.txt') :
cocok dengan semua file yang diakhiri dengan '.txt' di direktori saat iniglob.glob('*/*.txt') :
sama seperti 1glob.glob('**/*.txt') :
cocok dengan semua file yang diakhiri dengan '.txt' di subdirektori langsung saja , tetapi tidak di direktori saat iniglob.glob('*.txt',recursive=True) :
sama seperti 1glob.glob('*/*.txt',recursive=True) :
sama seperti 3glob.glob('**/*.txt',recursive=True):
cocok dengan semua file yang diakhiri dengan '.txt' di direktori saat ini dan di semua subdirektoriJadi yang terbaik adalah selalu menentukan
recursive=True.
sumber
The glob2 paket mendukung kartu liar dan cukup cepat
Di laptop saya, dibutuhkan sekitar 2 detik untuk mencocokkan > 60.000 jalur file .
sumber
Anda dapat menggunakan Formic dengan Python 2.6
Pengungkapan - Saya adalah pembuat paket ini.
sumber
Berikut adalah versi adaptasi yang memungkinkan
glob.glob
fungsionalitas serupa tanpa menggunakanglob2
.Jadi jika Anda memiliki struktur dir berikut
Anda bisa melakukan sesuatu seperti ini
Cukup banyak
fnmatch
pola yang cocok di seluruh nama file itu sendiri, bukan hanya nama file.sumber
configfiles = glob.glob('C:/Users/sam/Desktop/**/*.txt")
Tidak berfungsi untuk semua kasus, gunakan glob2
sumber
Jika Anda dapat menginstal paket glob2 ...
Semua nama file dan folder:
sumber
Jika Anda menjalankan Python 3.4+, Anda dapat menggunakan
pathlib
modul. ThePath.glob()
Metode mendukung**
pola, yang berarti “direktori ini dan semua subdirektori, rekursif”. Ini mengembalikan generator yang menghasilkanPath
objek untuk semua file yang cocok.sumber
Seperti yang ditunjukkan oleh Martijn, glob hanya dapat melakukan ini melalui
**
operator yang diperkenalkan dengan Python 3.5. Karena OP secara eksplisit meminta modul glob, berikut ini akan mengembalikan iterator evaluasi malas yang berperilaku serupaPerhatikan bahwa Anda hanya dapat mengulang sekali
configfiles
dalam pendekatan ini. Jika Anda memerlukan daftar sebenarnya dari configfiles yang dapat digunakan dalam beberapa operasi, Anda harus membuatnya secara eksplisit dengan menggunakanlist(configfiles)
.sumber
Perintah
rglob
akan melakukan rekursi tak terbatas ke sub-level terdalam dari struktur direktori Anda. Jika Anda hanya menginginkan satu level dalam, maka jangan gunakan itu.Saya menyadari OP sedang berbicara tentang penggunaan glob.glob. Saya yakin ini menjawab maksudnya, yaitu untuk mencari semua subfolder secara rekursif.
The
rglob
fungsi baru-baru ini menghasilkan peningkatan 100x dalam kecepatan untuk algoritma pengolahan data yang menggunakan struktur folder sebagai asumsi tetap untuk urutan membaca data. Namun, denganrglob
kami dapat melakukan satu pemindaian sekali melalui semua file pada atau di bawah direktori induk yang ditentukan, menyimpan nama mereka ke daftar (lebih dari satu juta file), kemudian menggunakan daftar tersebut untuk menentukan file mana yang perlu kami buka kapan saja. titik di masa mendatang hanya berdasarkan konvensi penamaan file vs. folder tempat mereka berada.sumber