Saya perlu menghitung jumlah file dalam direktori menggunakan Python.
Saya kira cara termudah adalah len(glob.glob('*'))
, tetapi itu juga menghitung direktori itu sendiri sebagai file.
Apakah ada cara untuk menghitung hanya file dalam direktori?
Saya perlu menghitung jumlah file dalam direktori menggunakan Python.
Saya kira cara termudah adalah len(glob.glob('*'))
, tetapi itu juga menghitung direktori itu sendiri sebagai file.
Apakah ada cara untuk menghitung hanya file dalam direktori?
Jawaban:
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 CWD
print 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))])
folder_path
dalam os.path.filename(name)
jika Anda tidak menggunakan cwd. stackoverflow.com/questions/17893542/…
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?
import os
path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
Untuk semua jenis file, subdirektori termasuk:
import os
list = os.listdir(dir) # dir is your directory path
number_files = len(list)
print number_files
Hanya file (menghindari subdirektori):
import os
onlyfiles = next(os.walk(dir))[2] #dir is your directory path as string
print len(onlyfiles)
Di sinilah fnmatch menjadi sangat berguna:
import fnmatch
print len(fnmatch.filter(os.listdir(dirpath), '*.txt'))
Rincian lebih lanjut: http://docs.python.org/2/library/fnmatch.html
os.path.isfile()
seperti jawaban yang diterima. Juga secara signifikan lebih cepat daripada glob.glob()
.
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)
_
dalam satu for
lingkaran. os.walk
saya juga tahu. Tapi tidak yakin apa yang terjadi dengan garis bawah di dalam sum
fungsi, bisa tolong jelaskan. Terima kasih!
import os
print len(os.listdir(os.getcwd()))
Saya terkejut bahwa tidak ada yang menyebutkan os.scandir
:
def count_files(dir):
return len([1 for x in list(os.scandir(dir)) if x.is_file()])
Ini menggunakan os.listdir
dan berfungsi untuk direktori apa pun:
import os
directory = 'mydirpath'
number_of_files = len([item for item in os.listdir(directory) if os.path.isfile(os.path.join(directory, item))])
ini dapat disederhanakan dengan generator dan dibuat sedikit lebih cepat dengan:
import os
isfile = os.path.isfile
join = os.path.join
directory = 'mydirpath'
number_of_files = sum(1 for item in os.listdir(directory) if isfile(join(directory, item)))
def count_em(valid_path):
x = 0
for root, dirs, files in os.walk(valid_path):
for f in files:
x = x+1
print "There are", x, "files in this directory."
return x
Diambil dari pos ini
files
adalah daftar. 2. OP tidak mencari hitungan rekursif
Ini adalah perintah satu baris sederhana yang menurut saya berguna:
print int(os.popen("ls | wc -l").read())
ls
umumnya 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.
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:
pdfCounter = len(glob.glob1(myPath,"*.pdf"))
Sederhana:
print(len([iq for iq in os.scandir('PATH')]))
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.
import os
total_con=os.listdir('<directory path>')
files=[]
for f_n in total_con:
if os.path.isfile(f_n):
files.append(f_n)
print len(files)
Jika Anda akan menggunakan shell standar dari sistem operasi, Anda bisa mendapatkan hasilnya jauh lebih cepat daripada menggunakan cara pythonic murni.
Contoh untuk Windows:
import os
import subprocess
def get_num_files(path):
cmd = 'DIR \"%s\" /A-D /B /S | FIND /C /V ""' % path
return int(subprocess.check_output(cmd, shell=True))
Saya menggunakan glob.iglob
struktur direktori yang mirip dengan
data
└───train
│ └───subfolder1
│ | │ file111.png
│ | │ file112.png
│ | │ ...
│ |
│ └───subfolder2
│ │ file121.png
│ │ file122.png
│ │ ...
└───test
│ file221.png
│ file222.png
Kedua 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"))
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 = 0
for f in os.listdir(path):
if os.path.isfile(os.path.join(path, f)):
count += 1
return count
path = r"C:\Users\EE EKORO\Desktop\Attack_Data" #Read files in folder
print (fcount(path))