Python—获取所有目录中的文件扩展名计数

Python—获取所有目录中的文件扩展名计数,python,Python,我们有一个拥有数十万个文件的硬盘 我需要计算出每个文件扩展名有多少个 如何使用python实现这一点 我需要它检查每个目录。我公司的律师需要这个。它可以是整个硬盘的总数,不必按目录细分 例如: 1232 JPEG 11 exe 45 bat 2342 avi 532 doc 工作脚本将非常简单,我建议您使用os.walk()函数。它所做的是跨目录树()生成文件名。查看操作系统。在操作系统模块中执行walk调用并遍历整个目录树。使用os.path.splitext获取扩展名。维护一个字典,在其中

我们有一个拥有数十万个文件的硬盘

我需要计算出每个文件扩展名有多少个

如何使用python实现这一点

我需要它检查每个目录。我公司的律师需要这个。它可以是整个硬盘的总数,不必按目录细分

例如:

1232 JPEG
11 exe
45 bat
2342 avi
532 doc

工作脚本将非常简单,我建议您使用os.walk()函数。它所做的是跨目录树()生成文件名。

查看操作系统。在操作系统模块中执行walk调用并遍历整个目录树。使用
os.path.splitext
获取扩展名。维护一个字典,在其中键入extension.lower()并增加遇到的每个扩展的计数

import os
import collections
extensions = collections.defaultdict(int)

for path, dirs, files in os.walk('/'):
   for filename in files:
       extensions[os.path.splitext(filename)[1].lower()] += 1

for key,value in extensions.items():
    print 'Extension: ', key, ' ', value, ' items'
模式很简单

counter = 0 
for root, dirs, files in os.walk(YourPath):
    for file in files:    
        if file.endswith(EXTENSION):
            counter += 1
您可以使用扩展名列表创建一个数组并添加它们。另一个更快的方法是创建一本逐渐增长的词典。然后,扩展名是用于添加值的键。{jpeg:1232,exe:11}

更新:对于我们提出的许多解决方案,我们假设字符串是文件类型的正确表示形式。但我不确定是否还有其他方法可以做到这一点。迭代应该只进行一次,正如下面的评论所说。因此,最好是一点一点地增加字典

import os
from os.path import splitext

extensions = {}
for root, dir, files in os.walk('/'):
    for file in files:
        ext = splitext(file)[1]
        try:
            extensions[ext] += 1
        except KeyError:
            extensions[ext] = 1
使用
DefaultDict
可能会更好,如果您愿意,可以使用它

然后,可以按如下方式打印值:

for extension, count in extensions.items():
    print 'Extension %s has %d files' % (extension, count)
使用
os.walk()
浏览文件,使用
os.path.splitext()
仅获取扩展名。您可能也想
lower()
扩展,因为至少在我的$HOME中,我有一堆.jpg和一堆.jpg

import os, os.path, collections
extensionCount = collections.defaultdict(int)
for root, dirs, files in os.walk('.'):
    for file in files:
        base, ext = os.path.splitext(file)
        extensionCount[ext.lower()] += 1
#Now print them out, largest to smallest.
for ext, count in sorted(extensionCount.items(), key=lambda x: x[1], reverse=True):
    print ext, count

你查过os.walk了吗?啊,律师!他们真的关心文件扩展名而不是内容或类型吗?
os.path.splitext
处理一些特殊情况,例如以点开头的文件名。@Reiner,是的,splitext是个好主意。在同一个代码段中修改并使用它。
splitext
返回一个元组(root,ext)。您可能只想使用第二个元素(现在它使用整个元组作为字典的键)。此外,是否需要检索文件的绝对路径?在我看来,这里只对文件名本身感兴趣。@Reiner,我忽略了SplitText部分(未参考文档),很抱歉,我更正了它,并立即修改了代码中的绝对路径,因为它不是必需的。谢谢你的反馈。这正是我需要的解决方案。谢谢。为什么for循环缩进了?此外,这将是一种效率较低的方法(字典查找非常便宜,迭代则不然),缩进是由于我将修复的笨拙it@JOE不,没有。不过,这很容易修复(请注意,如果将其指向根目录,则需要很长时间才能运行)@JOE我添加了一个循环来输出数据JOE,Rafe有最优雅的解决方案。NameError:name'defaultdict'未定义抱歉,已修复。它应该是
collections.defaultdict
,而不仅仅是
defaultdict
。现在还有一个更好的print语句。对于Python2.7及更高版本:另请参见哪一个比
defaultdict