Bagaimana saya bisa menemukan semua file dalam direktori yang memiliki ekstensi .txt
dalam python?
1043
Anda bisa menggunakan glob
:
import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
print(file)
atau hanya os.listdir
:
import os
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
print(os.path.join("/mydir", file))
atau jika Anda ingin melintasi direktori, gunakan os.walk
:
import os
for root, dirs, files in os.walk("/mydir"):
for file in files:
if file.endswith(".txt"):
print(os.path.join(root, file))
for file in f
daripada karenafor files in f
karena apa yang ada dalam variabel adalah nama file tunggal. Yang lebih baik adalah mengubahf
tofiles
dan kemudian for for loop menjadifor file in files
.file
bukan kata yang dilindungi undang-undang, hanya nama fungsi yang telah ditentukan, jadi sangat mungkin untuk menggunakannya sebagai nama variabel dalam kode Anda sendiri. Meskipun memang benar bahwa secara umum seseorang harus menghindari tabrakan seperti itu,file
adalah kasus khusus karena hampir tidak pernah ada kebutuhan untuk menggunakannya, sehingga sering dianggap pengecualian terhadap pedoman. Jika Anda tidak ingin melakukan itu, PEP8 merekomendasikan menambahkan satu garis bawah untuk nama-nama tersebut, yaitufile_
, yang harus Anda setujui masih dapat dibaca.Gunakan glob .
sumber
glob
tidak dapat menemukan file secara rekursif jika python Anda di bawah 3.5. informasi lebih lanjutSesuatu seperti itu harus melakukan pekerjaannya
sumber
root, dirs, files
bukanr, d, f
. Jauh lebih mudah dibaca.Sesuatu seperti ini akan bekerja:
sumber
os.path.join
pada setiap elementext_files
. Bisa jadi sesuatu sepertitext_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt')]
.Anda cukup menggunakan
pathlib
s 1 :glob
atau dalam satu lingkaran:
Jika Anda menginginkannya bersifat rekursif, Anda dapat menggunakannya
.glob('**/*.txt)
1 The
pathlib
Modul termasuk dalam perpustakaan standar di python 3.4. Tetapi Anda dapat menginstal port-kembali modul itu bahkan pada versi Python yang lebih lama (yaitu menggunakanconda
ataupip
):pathlib
danpathlib2
.sumber
**/*.txt
tidak didukung oleh versi python yang lebih lama. Jadi saya memecahkan masalah ini dengan:foundfiles= subprocess.check_output("ls **/*.txt", shell=True)
for foundfile in foundfiles.splitlines():
print foundfile
pathlib
bisa dilakukan dan saya sudah memasukkan persyaratan versi Python. :) Tetapi jika pendekatan Anda belum diposting mengapa tidak menambahkannya sebagai jawaban lain?rglob
jika Anda ingin mencari item secara rekursif. Misalnya.rglob('*.txt')
sumber
Saya suka os.walk () :
Atau dengan generator:
sumber
Berikut ini lebih banyak versi yang sama yang menghasilkan hasil yang sedikit berbeda:
glob.iglob ()
glob.glob1 ()
fnmatch.filter ()
sumber
glob1()
adalah fungsi pembantu dalamglob
modul yang tidak tercantum dalam dokumentasi Python. Ada beberapa komentar inline yang menjelaskan apa yang dilakukannya di file sumber, lihat.../Lib/glob.py
.glob.glob1()
tidak umum tetapi tersedia di Python 2.4-2.7; 3.0-3.2; pypy; jython github.com/zed/test_glob1glob
modul.path.py adalah alternatif lain: https://github.com/jaraco/path.py
sumber
for f in p.walk(pattern='*.txt')
melalui setiap subfolderlist(p.glob('**/*.py'))
Python v3.5 +
Metode cepat menggunakan os.scandir dalam fungsi rekursif. Mencari semua file dengan ekstensi yang ditentukan dalam folder dan sub-folder.
Perbarui April 2019
Jika Anda mencari di direktori yang berisi 10.000 file, menambahkan ke daftar menjadi tidak efisien. 'Menghasilkan' hasilnya adalah solusi yang lebih baik. Saya juga menyertakan fungsi untuk mengkonversi output ke Pandframe Dataframe.
sumber
Python memiliki semua alat untuk melakukan ini:
sumber
all_txt_files = list(filter(lambda x: x.endswith('.txt'), os.listdir(the_dir)))
Untuk mendapatkan semua nama file '.txt' di dalam folder 'dataPath' sebagai daftar dengan cara Pythonic:
sumber
Coba ini, ini akan menemukan semua file Anda secara rekursif:
sumber
**
. Hanya tersedia dalam python 3. Yang tidak saya sukai adalahchdir
bagiannya. Tidak perlu untuk itu.filepath = os.path.join('wallpaper')
dan kemudian menggunakannya sebagaiglob.glob(filepath+"**/*.psd", recursive = True)
, yang akan menghasilkan hasil yang sama.sumber
Saya melakukan tes (Python 3.6.4, W7x64) untuk melihat solusi mana yang tercepat untuk satu folder, tanpa subdirektori, untuk mendapatkan daftar path file lengkap untuk file dengan ekstensi spesifik.
Singkatnya, untuk tugas ini
os.listdir()
adalah yang tercepat dan 1,7x lebih cepat dari yang terbaik berikutnya:os.walk()
(dengan istirahat!), 2,7x secepatpathlib
, 3,2x lebih cepat darios.scandir()
dan 3,3x lebih cepat daripadaglob
.Harap diingat, bahwa hasil itu akan berubah ketika Anda membutuhkan hasil rekursif. Jika Anda menyalin / menempel satu metode di bawah ini, harap tambahkan .lower () jika tidak .EXT tidak akan ditemukan saat mencari .ext.
Hasil:
sumber
Kode ini membuat hidup saya lebih sederhana.
sumber
Gunakan fnmatch: https://docs.python.org/2/library/fnmatch.html
sumber
Untuk mendapatkan larik nama file ".txt" dari folder bernama "data" di direktori yang sama, saya biasanya menggunakan baris kode sederhana ini:
sumber
Saya menyarankan Anda untuk menggunakan fnmatch dan metode atas. Dengan cara ini Anda dapat menemukan salah satu dari yang berikut:
.
sumber
Ini satu dengan
extend()
sumber
.txt
:)Solusi fungsional dengan sub-direktori:
sumber
Jika folder tersebut berisi banyak file atau memori merupakan kendala, pertimbangkan untuk menggunakan generator:
Opsi A: Iterate
Opsi B: Dapatkan semua
sumber
Solusi copy-pastable mirip dengan ghostdog:
sumber
gunakan modul Python OS untuk menemukan file dengan ekstensi spesifik.
contoh sederhana ada di sini:
sumber
Banyak pengguna menjawab dengan
os.walk
jawaban, yang mencakup semua file tetapi juga semua direktori dan subdirektori dan file mereka.Atau untuk yang tidak memerlukan generator:
Jika Anda akan menggunakan kecocokan untuk sesuatu yang lain, Anda mungkin ingin menjadikannya daftar daripada ekspresi generator:
sumber
Metode sederhana dengan menggunakan
for
loop:Padahal ini bisa dibuat lebih umum.
sumber