返回目录及其子目录中的文件总数

50

希望创建一个函数,返回目录及其子目录中找到的文件数量。只需要帮助开始

6个回答

107

一句话简述

import os
cpt = sum([len(files) for r, d, files in os.walk("G:\CS\PYTHONPROJECTS")])

你能解释一下为什么需要sum函数吗?为什么len(files)不足以满足需求呢? - G Warner
8
从每个子目录中 os.walk 都会返回多组文件集合。您需要对每组文件集合的长度求和,以获取文件的总量。如果使用 len(files),则会得到一个列表,其中每个元素是其关联子目录中文件的数量。 - Lightyear Buzz
1
请注意,您需要使用正斜杠(或\\)代替反斜杠,否则Python会认为您正在使用转义字符。 - Starwarswii

31

6
只需添加一个elif语句来处理目录即可:
def fileCount(folder):
    "count the number of files in a directory"

    count = 0

    for filename in os.listdir(folder):
        path = os.path.join(folder, filename)

        if os.path.isfile(path):
            count += 1
        elif os.path.isfolder(path):
            count += fileCount(path)

    return count

2
在Ubuntu上,os.path.isdir对我有效,而不是os.path.isfolder - Jeppe

2

这里是三种最流行方法的时间测试:

import os
from datetime import datetime

dir_path = "D:\\Photos"

# os.listdir

def recursive_call(dir_path):
    folder_array = os.listdir(dir_path)
    files = 0
    folders = 0
    for path in folder_array:
        if os.path.isfile(os.path.join(dir_path, path)):
            files += 1
        elif os.path.isdir(os.path.join(dir_path, path)):
            folders += 1
            file_count, folder_count = recursive_call(os.path.join(dir_path, path))
            files += file_count
            folders += folder_count
    return files, folders
start_time = datetime.now()
files, folders = recursive_call(dir_path)
print ("\nFolders: %d, Files: %d" % (folders, files))
print ("Time Taken (os.listdir): %s seconds" % (datetime.now() - start_time).total_seconds())

# os.walk

start_time = datetime.now()
file_array = [len(files) for r, d, files in os.walk(dir_path)]
files = sum(file_array)
folders = len(file_array)
print ("\nFolders: %d, Files: %d" % (folders, files))
print ("Time Taken (os.walk): %s seconds" % (datetime.now() - start_time).total_seconds())

# os.scandir

def recursive_call(dir_path):
    folder_array = os.scandir(dir_path)
    files = 0
    folders = 0
    for path in folder_array:
        if path.is_file():
            files += 1
        elif path.is_dir():
            folders += 1
            file_count, folder_count = recursive_call(path)
            files += file_count
            folders += folder_count
    return files, folders
start_time = datetime.now()
files, folders = recursive_call(dir_path)
print ("\nFolders: %d, Files: %d" % (folders, files))
print ("Time Taken (os.scandir): %s seconds" % (datetime.now() - start_time).total_seconds())

结果:

Folders: 53, Files: 29048
Time Taken (os.listdir): 3.074945 seconds

Folders: 53, Files: 29048
Time Taken (os.walk): 0.062022 seconds

Folders: 53, Files: 29048
Time Taken (os.scandir): 0.048984 seconds

结论:
虽然 os.walk 是最优雅的,但递归实现的 os.scandir 似乎是最快的。

2
以下是一些使用 pathlib 的单行代码,它是标准库的一部分。 使用 Path.cwd().rglob('*')Path('some path').rglob('*'),可以创建一个所有文件的生成器。 通过list*来展开生成器,并使用len获取文件数。 查看 如何计算每个子目录中文件的总数 来获取每个目录的文件总数。
from pathlib import Path

total_dir_files = len(list(Path.cwd().rglob('*')))

# or 
total_dir_files = len([*Path.cwd().rglob('*')])

# or filter for only files using is_file()
file_count = len([f for f in Path.cwd().rglob('*') if f.is_file()])

0

这是我的版本

def fileCount(folder, allowed_extensions=None):
   "count the number of files in a directory and sub directory"
   count = 0
   for base, dirs, files in os.walk(folder):
      for file in files:
         if allowed_extensions and file.endswith(allowed_extensions) or not allowed_extensions:
            count += 1
   return count

scan_dir = r"C:\Users\sannjayy\Desktop"

allowed_extensions = (".jpg", ".mp4")

print(fileCount(scan_dir , allowed_extensions))

扫描目录 = r"C:\Users\sannjayy\Desktop"

允许的扩展名 = (".jpg", ".mp4")

print(fileCount(扫描目录, 允许的扩展名))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接