首页 > 解决方案 > 递归查找目录文件计数

问题描述

我有几百万个文件的平面列表,我想递归地找到每个目录的文件数。一个输入/输出的例子是:

# files.csv
/mnt/main/files/four.txt
/mnt/main/files/five.txt
/mnt/second/new.mov

我想要得到的输出是:

{
    'mnt': 3,
    'mnt/main': 2,
    'mnt/main/files': 2,
    'mnt/second': 1
}

目前我正在做一些非常幼稚的事情,例如:

import os
from collections import defaultdict
DIRS = defaultdict(int)
for file in files:
    for num in range(1, file.count('/')): # ignore escapes
        dir = '/' + '/'.join(file.split('/')[1:num+1])
        DIRS[dir] += 1

# {'/mnt/main/files': 2, '/mnt': 3, '/mnt/main': 2, '/mnt/second': 1}

有什么更好的方法来做到这一点?我正在考虑可能会使用的东西yield

标签: pythonpython-3.xalgorithm

解决方案


我建议你可以试试这种方法:

import pathlib
from typing import List
from collections import Counter
from dataclasses import dataclass, field


#@dataclass
#class CountFiles:
#    files: List[str]
#    counter: Counter = field(default_factory=Counter)
#
#    def __post_init__(self):
class CountFiles:
    def __init__(self, files):
        self.files = files
        self.counter = Counter()
        for f in self.files:
            path = pathlib.Path(f)
            self.drill(path)

    def drill(self, path: pathlib.Path):
        self.counter[str(path.parent)] += 1
        if len(path.parts) > 1:
            return self.drill(path.parent)

    def show(self):
        return dict(self.counter.most_common())


files = [
    '/mnt/main/files/four.txt',
    '/mnt/main/files/five.txt',
    '/mnt/second/new.mov'
]

cf = CountFiles(files)
print(cf.show())
# {'/': 6, '/mnt': 3, '/mnt/main/files': 2, '/mnt/main': 2, '/mnt/second': 1}

推荐阅读