Untuk meninggalkan direktori, Anda dapat melakukan '* .fileextension' untuk ekstensi file apa pun yang Anda cari.
Jawaban:
275
os.listdir()akan sedikit lebih efisien daripada menggunakan glob.glob. Untuk menguji apakah nama file adalah file biasa (dan bukan direktori atau entitas lain), gunakan os.path.isfile():
import os, os.path
# simple version for working with CWDprint len([name for name in os.listdir('.')if os.path.isfile(name)])# path joining version for other paths
DIR ='/tmp'print len([name for name in os.listdir(DIR)if os.path.isfile(os.path.join(DIR, name))])
Ini tidak menghitung file di dalam folder bersarang.
codersofthedark
5
Untuk menghitung file secara berulang yang bersarang di dalam direktori, Anda mungkin lebih baik dengan solusi os.walk ().
Joel B
Apa manfaat menggunakan os.path.join(DIR, name)lebih DIR + '/' + name? Yang terakhir lebih pendek dan, IMO, lebih jelas dari yang pertama. Apakah mungkin ada beberapa OS: di mana yang terakhir akan gagal?
HelloGoodbye
@ HaloGoodbye Itulah alasannya.
ellockie
102
import os
path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
Ini jauh lebih cepat (sekitar separuh waktu dengan pengujian saya pada direktori dengan 10.000 file) jika Anda tahu pola yang Anda cari, daripada menguji setiap file dengan os.path.isfile()seperti jawaban yang diterima. Juga secara signifikan lebih cepat daripada glob.glob().
CivFan
14
Jika Anda ingin menghitung semua file dalam direktori - termasuk file dalam subdirektori, cara yang paling pythonic adalah:
import os
file_count = sum(len(files)for _, _, files in os.walk(r'C:\Dropbox'))print(file_count)
Kami menggunakan jumlah yang lebih cepat daripada secara eksplisit menambahkan jumlah file (timing tertunda)
Hai, saya mencoba memahami kode ini (kode ini berfungsi dengan sempurna), saya tahu kita dapat menggunakannya _dalam satu forlingkaran. os.walksaya juga tahu. Tapi tidak yakin apa yang terjadi dengan garis bawah di dalam sumfungsi, bisa tolong jelaskan. Terima kasih!
Ejaz
1
Unsderscore hanyalah nama variabel @Ejaz, dengan konvensi yang digunakan ketika kita mengabaikan variabel - itulah yang kita lakukan di sini - kita sebut berjalan dan hanya menghitung jumlah file di setiap direktori, mengabaikan nilai pengembalian root dan dirs walk
def count_em(valid_path):
x =0for root, dirs, files in os.walk(valid_path):for f in files:
x = x+1print"There are", x,"files in this directory."return x
Parsing output lsumumnya disukai (sering dapat menyebabkan masalah), meskipun ini bukan metode "cepat-dan-kotor" yang buruk di shell. Anda harus menggunakan ls -1, jadi itu menjamin satu baris per file.
Bloodgain
3
Sementara saya setuju dengan jawaban yang diberikan oleh @DanielStutzbach: os.listdir() akan sedikit lebih efisien daripada menggunakan glob.glob.
Namun, ketepatan ekstra, jika Anda ingin menghitung jumlah file tertentu dalam folder, Anda ingin menggunakannya len(glob.glob()). Misalnya jika Anda menghitung semua pdf dalam folder yang ingin Anda gunakan:
itu hanya menghitung jumlah file dalam direktori, saya telah menggunakan teknik pemahaman daftar untuk beralih melalui direktori tertentu mengembalikan semua file sebagai balasannya. "len (daftar yang dikembalikan)" mengembalikan jumlah file.
OP meminta jumlah file , ini daftar direktori juga.
Korem
1
Jika Anda akan menggunakan shell standar dari sistem operasi, Anda bisa mendapatkan hasilnya jauh lebih cepat daripada menggunakan cara pythonic murni.
Saya menemukan jawaban lain yang mungkin benar sebagai jawaban yang diterima.
for root, dirs, files in os.walk(input_path):for name in files:if os.path.splitext(name)[1]=='.TXT'or os.path.splitext(name)[1]=='.txt':
datafiles.append(os.path.join(root,name))print len(files)
saya melakukan ini dan ini mengembalikan jumlah file di folder (Attack_Data) ... ini berfungsi dengan baik.
import os
def fcount(path):#Counts the number of files in a directory
count =0for f in os.listdir(path):if os.path.isfile(os.path.join(path, f)):
count +=1return count
path = r"C:\Users\EE EKORO\Desktop\Attack_Data"#Read files in folderprint(fcount(path))
Jawaban:
os.listdir()
akan sedikit lebih efisien daripada menggunakanglob.glob
. Untuk menguji apakah nama file adalah file biasa (dan bukan direktori atau entitas lain), gunakanos.path.isfile()
:sumber
folder_path
dalamos.path.filename(name)
jika Anda tidak menggunakan cwd. stackoverflow.com/questions/17893542/…os.path.join(DIR, name)
lebihDIR + '/' + name
? Yang terakhir lebih pendek dan, IMO, lebih jelas dari yang pertama. Apakah mungkin ada beberapa OS: di mana yang terakhir akan gagal?sumber
Untuk semua jenis file, subdirektori termasuk:
Hanya file (menghindari subdirektori):
sumber
Di sinilah fnmatch menjadi sangat berguna:
Rincian lebih lanjut: http://docs.python.org/2/library/fnmatch.html
sumber
os.path.isfile()
seperti jawaban yang diterima. Juga secara signifikan lebih cepat daripadaglob.glob()
.Jika Anda ingin menghitung semua file dalam direktori - termasuk file dalam subdirektori, cara yang paling pythonic adalah:
Kami menggunakan jumlah yang lebih cepat daripada secara eksplisit menambahkan jumlah file (timing tertunda)
sumber
_
dalam satufor
lingkaran.os.walk
saya juga tahu. Tapi tidak yakin apa yang terjadi dengan garis bawah di dalamsum
fungsi, bisa tolong jelaskan. Terima kasih!sumber
sumber
Saya terkejut bahwa tidak ada yang menyebutkan
os.scandir
:sumber
Ini menggunakan
os.listdir
dan berfungsi untuk direktori apa pun:ini dapat disederhanakan dengan generator dan dibuat sedikit lebih cepat dengan:
sumber
Diambil dari pos ini
sumber
files
adalah daftar. 2. OP tidak mencari hitungan rekursifsumber
Kode Luke diformat ulang.
sumber
Ini adalah perintah satu baris sederhana yang menurut saya berguna:
sumber
ls
umumnya disukai (sering dapat menyebabkan masalah), meskipun ini bukan metode "cepat-dan-kotor" yang buruk di shell. Anda harus menggunakanls -1
, jadi itu menjamin satu baris per file.Sementara saya setuju dengan jawaban yang diberikan oleh @DanielStutzbach:
os.listdir()
akan sedikit lebih efisien daripada menggunakanglob.glob
.Namun, ketepatan ekstra, jika Anda ingin menghitung jumlah file tertentu dalam folder, Anda ingin menggunakannya
len(glob.glob())
. Misalnya jika Anda menghitung semua pdf dalam folder yang ingin Anda gunakan:sumber
Sederhana:
itu hanya menghitung jumlah file dalam direktori, saya telah menggunakan teknik pemahaman daftar untuk beralih melalui direktori tertentu mengembalikan semua file sebagai balasannya. "len (daftar yang dikembalikan)" mengembalikan jumlah file.
sumber
sumber
Jika Anda akan menggunakan shell standar dari sistem operasi, Anda bisa mendapatkan hasilnya jauh lebih cepat daripada menggunakan cara pythonic murni.
Contoh untuk Windows:
sumber
Saya menemukan jawaban lain yang mungkin benar sebagai jawaban yang diterima.
sumber
Saya menggunakan
glob.iglob
struktur direktori yang mirip denganKedua opsi berikut mengembalikan 4 (seperti yang diharapkan, yaitu tidak menghitung sendiri subfolder )
len(list(glob.iglob("data/train/*/*.png", recursive=True)))
sum(1 for i in glob.iglob("data/train/*/*.png"))
sumber
saya melakukan ini dan ini mengembalikan jumlah file di folder (Attack_Data) ... ini berfungsi dengan baik.
sumber