计算子文件夹中文件总数的最佳方法(python)

2024-04-25 20:44:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我的文件结构如下所示:

  • 外部文件夹
    • 内部文件夹1
      • 文件。。。你知道吗
    • 内部文件夹2
      • 文件。。。你知道吗

我正在计算整个外部文件夹中的文件总数。os.步行当我将其传递到外部文件夹时不返回任何文件,并且由于我只有两层,所以我手动编写了它:

total = 0
folders = ([name for name in os.listdir(Outer_folder)
            if os.path.isdir(os.path.join(Outer_folder, name))])
for folder in folders:
    contents = os.listdir(os.path.join(Outer_folder, folder))
    total += len(contents)
print(total)

有更好的方法吗?我能在一组任意嵌套的文件夹中找到文件的数量吗?我在stackoverflow上看不到任何深度嵌套文件夹的示例。你知道吗

(我所说的“更好”是指某种内置函数,而不是手动编写某种要迭代的东西,例如os.步行(走遍整棵树)


Tags: 文件pathnamein文件夹foros手动
3条回答

我建议您使用递归作为以下函数:

def get_folder_count(path):
    folders = os.listdir(path)
    folders = list(filter(lambda a: os.path.isdir(os.path.join(path, a)), folders))
    count = len(folders)
    for i in range(count):
        count += get_folder_count(os.path.join(path, folders[i]))
    return count

下面是Blender here建议的一种方法。 def fileCount(文件夹): “计算目录中的文件数”

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

这被包装在一个函数中。但你需要澄清你所说的“最好”是什么意思。那是最快的吗?最具可读性?记忆最差?你知道吗

使用pathlib

显然你也想要这些文件:

from pathlib import Path
import numpy as np

p = Path.cwd()  # if you're running in the current dir
p = Path('path to to dir')  # pick one 

# gets all the files
f = [y for y in p.rglob(f'*')] 

# counts them
values, counts = np.unique([x.parent for x in f ], return_counts=True)

print(list(zip(counts, values)))

输出:

  • 包含count和path的元组列表
[(8, WindowsPath('E:/PythonProjects/stack_overflow')),
 (2, WindowsPath('E:/PythonProjects/stack_overflow/.ipynb_checkpoints')),
 (7, WindowsPath('E:/PythonProjects/stack_overflow/complete_solutions/data')),
 (3, WindowsPath('E:/PythonProjects/stack_overflow/csv_files')),
 (1,
  WindowsPath('E:/PythonProjects/stack_overflow/csv_files/.ipynb_checkpoints')),
 (5, WindowsPath('E:/PythonProjects/stack_overflow/data'))]
  • print(f)将返回文件列表

相关问题 更多 >