python - 递归查找目录文件计数
问题描述
我有几百万个文件的平面列表,我想递归地找到每个目录的文件数。一个输入/输出的例子是:
# 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
。
解决方案
我建议你可以试试这种方法:
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}
推荐阅读
- javascript - 计数字符串出现并用字符串和计数替换 - JS
- android - 以编程方式从存储中共享 GIF 文件
- python - 在特定日期范围内合并 Pandas DataFrame
- amazon-web-services - 如何在 AWS ALB 上重定向到 https://example.com/ 而不是 https://example.com:443/?
- windows-subsystem-for-linux - 如何将 Windows 主机文件条目与在 WSL 上运行的进程相关联
- python - 一个协程在等待之后返回一个协程
- pandas - 如何将 csv 文件加载到 SparkSession 中
- prolog - Prolog:在 Prolog 中定义逻辑运算符作为其他运算符的占位符
- python - 无法渲染特定项目,烧瓶/sqlalchemy
- kubernetes - 由于 Out of Memory Killed 导致 Pod 容器重启的可能原因有哪些?