Tôi cần đếm số lượng tệp trong một thư mục bằng Python.
Tôi đoán cách dễ nhất là len(glob.glob('*'))
, nhưng nó cũng tính chính thư mục đó là một tập tin.
Có cách nào để chỉ đếm các tập tin trong một thư mục?
Tôi cần đếm số lượng tệp trong một thư mục bằng Python.
Tôi đoán cách dễ nhất là len(glob.glob('*'))
, nhưng nó cũng tính chính thư mục đó là một tập tin.
Có cách nào để chỉ đếm các tập tin trong một thư mục?
Câu trả lời:
os.listdir()
sẽ hiệu quả hơn một chút so với sử dụng glob.glob
. Để kiểm tra xem tên tệp có phải là tệp thông thường không (không phải là thư mục hoặc thực thể khác), hãy sử dụng 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
bên trong os.path.filename(name)
nếu bạn không ở trên cwd. stackoverflow.com/questions/17893542/ Mạnh
os.path.join(DIR, name)
hơn là DIR + '/' + name
gì? Cái sau ngắn hơn và, IMO, rõ ràng hơn cái trước. Có lẽ có một số hệ điều hành: es mà sau này sẽ thất bại?
import os
path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
Đối với tất cả các loại tệp, thư mục con bao gồm:
import os
list = os.listdir(dir) # dir is your directory path
number_files = len(list)
print number_files
Chỉ các tệp (tránh thư mục con):
import os
onlyfiles = next(os.walk(dir))[2] #dir is your directory path as string
print len(onlyfiles)
Đây là nơi mà fnmatch rất tiện dụng:
import fnmatch
print len(fnmatch.filter(os.listdir(dirpath), '*.txt'))
Thêm chi tiết: http://docs.python.org/2/l Library / fnmatch.html
os.path.isfile()
câu trả lời được chấp nhận. Cũng nhanh hơn đáng kể glob.glob()
.
Nếu bạn muốn đếm tất cả các tệp trong thư mục - bao gồm các tệp trong thư mục con, cách thức pythonic nhất là:
import os
file_count = sum(len(files) for _, _, files in os.walk(r'C:\Dropbox'))
print(file_count)
Chúng tôi sử dụng tổng số nhanh hơn so với việc thêm rõ ràng số lượng tệp (thời gian chờ xử lý)
_
trong một for
vòng lặp. os.walk
tôi cũng biết Nhưng không chắc chắn những gì đang xảy ra với dấu gạch dưới bên trong sum
chức năng, bạn có thể vui lòng giải thích. Cảm ơn!
import os
print len(os.listdir(os.getcwd()))
Tôi ngạc nhiên khi không ai nhắc đến os.scandir
:
def count_files(dir):
return len([1 for x in list(os.scandir(dir)) if x.is_file()])
Điều này sử dụng os.listdir
và làm việc cho bất kỳ thư mục:
import os
directory = 'mydirpath'
number_of_files = len([item for item in os.listdir(directory) if os.path.isfile(os.path.join(directory, item))])
điều này có thể được đơn giản hóa với một trình tạo và thực hiện nhanh hơn một chút với:
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
Lấy từ bài đăng này
files
là một danh sách. 2. OP không tìm kiếm số đệ quy
Đây là một lệnh đơn giản mà tôi thấy hữu ích:
print int(os.popen("ls | wc -l").read())
ls
thường được xem là khó chịu (nó thường có thể gây ra sự cố), mặc dù đây không phải là một phương pháp "nhanh và bẩn" xấu ở vỏ. ls -1
Tuy nhiên, bạn nên sử dụng để đảm bảo một dòng trên mỗi tệp.
Mặc dù tôi đồng ý với câu trả lời được cung cấp bởi @DanielStutzbach: os.listdir()
sẽ hiệu quả hơn một chút so với sử dụng glob.glob
.
Tuy nhiên, độ chính xác cao hơn, nếu bạn muốn đếm số lượng tệp cụ thể trong thư mục, bạn muốn sử dụng len(glob.glob())
. Chẳng hạn, nếu bạn đếm tất cả các pdf trong một thư mục bạn muốn sử dụng:
pdfCounter = len(glob.glob1(myPath,"*.pdf"))
Nó đơn giản:
print(len([iq for iq in os.scandir('PATH')]))
nó chỉ đơn giản là đếm số lượng tập tin trong thư mục, tôi đã sử dụng kỹ thuật hiểu danh sách để lặp qua thư mục cụ thể trả lại tất cả các tập tin. "Len (danh sách trả về)" trả về số lượng tệp.
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)
Nếu bạn sẽ sử dụng lớp vỏ tiêu chuẩn của hệ điều hành, bạn có thể nhận được kết quả nhanh hơn nhiều so với sử dụng cách thức pythonic thuần túy.
Ví dụ cho 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))
Tôi đã sử dụng glob.iglob
cho một cấu trúc thư mục tương tự như
data
└───train
│ └───subfolder1
│ | │ file111.png
│ | │ file112.png
│ | │ ...
│ |
│ └───subfolder2
│ │ file121.png
│ │ file122.png
│ │ ...
└───test
│ file221.png
│ file222.png
Cả hai tùy chọn sau đều trả về 4 (như mong đợi, tức là không tính chính các thư mục con )
len(list(glob.iglob("data/train/*/*.png", recursive=True)))
sum(1 for i in glob.iglob("data/train/*/*.png"))
tôi đã làm điều này và điều này trả về số lượng tệp trong thư mục (Attack_Data) ... điều này hoạt động tốt.
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))