计算目录和子目录中的文件夹数

时间:2015-04-21 10:11:17

标签: python python-2.7 directory

我有一个脚本可以准确地告诉我目录中有多少文件,以及其中的子目录。但是,我也在研究识别同一目录及其子目录中有多少个文件夹......

我目前的剧本:

import os, getpass
from os.path import join, getsize
user = 'Copy of ' + getpass.getuser()
path = "C://Documents and Settings//" + user + "./"
folder_counter = sum([len(folder) for r, d, folder in os.walk(path)])
file_counter = sum([len(files) for r, d, files in os.walk(path)])
print ' [*] ' + str(file_counter) + ' Files were found and ' + str(folder_counter) + ' folders'

此代码为我提供了打印:[*] 147 Files were found and 147 folders

意味着folder_counter不计算正确的元素。如何更正此问题,以便folder_counter正确无误?

4 个答案:

答案 0 :(得分:8)

Python 2.7解决方案

对于单个目录,你也可以这样做:

import os
print len(os.walk('dir_name').next()[1])

它不会加载整个字符串列表,也会返回'dir_name'目录中的目录数量。

Python 3.x解决方案

由于许多人只是想要一个简单快速的解决方案,而没有真正理解解决方案,我编辑我的答案,包括Python 3.x的确切工作代码。

因此,在Python 3.x中,我们使用next方法而不是.next。因此,上面的代码段变成:

import os
print(len(next(os.walk('dir_name'))[1]))

其中dir_name是您要查找内部目录数的目录。

答案 1 :(得分:2)

我想你想要这样的东西:

import os

files = folders = 0

for _, dirnames, filenames in os.walk(path):
  # ^ this idiom means "we won't be using this value"
    files += len(filenames)
    folders += len(dirnames)

print "{:,} files, {:,} folders".format(files, folders)

请注意,这只会迭代os.walk一次,这将使包含大量文件和目录的路径更快。在我的Python目录上运行它给了我:

30,183 files, 2,074 folders

与Windows文件夹属性视图告诉我的内容完全匹配。


请注意,您当前的代码会计算两次相同的数字,因为仅更改会重新调用从os.walk调用返回的值之一:

folder_counter = sum([len(folder) for r, d, folder in os.walk(path)])
                        # ^ here          # ^ and here
file_counter = sum([len(files) for r, d, files in os.walk(path)])
                      # ^ vs. here     # ^ and here

尽管名称发生了变化,但您仍在计算相同的值(即,它是您正在使用的三个返回值中的第三个)! Python函数不知道什么名称(例如,如果有的话;你可以做print list(os.walk(path))),他们返回的值将被分配给他们,并且他们的行为肯定会赢得#t因此而改变。根据{{​​3}},os.walk会返回一个三元组(dirpath, dirnames, filenames),以及您用于此的名称,例如是否:

for foo, bar, baz in os.walk(...):

或:

for all_three in os.walk(..):

不会改变它。

答案 2 :(得分:0)

如果只对个文件夹感兴趣,我发现最快的方法是:

import os

folder_count = 0  # type: int

input_path = "/path/to/your/input/dir"  # type: str
for folders in os.listdir(input_path):
    folder_count += 1  # increment counter

print("There are {0} folders".format(folder_count))

该方法假定输入目录中只有文件夹(即没有多余的文件)

答案 3 :(得分:-2)

>>> import os
>>> len(list(os.walk('folder_name')))

根据os.walk,第一个参数 dirpath 枚举所有目录。