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

Luk*_*mer 2 python directory python-2.7

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

我目前的剧本:

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'
Run Code Online (Sandbox Code Playgroud)

这段代码给了我打印出来的:[*] 147 Files were found and 147 folders.

这意味着folder_counter不计算正确的元素.我怎样才能纠正这个问题folder_counter呢?

Xxx*_*xxo 9

Python 2.7解决方案

对于单个目录,您还可以执行以下操作:

import os
print len(os.walk('dir_name').next()[1])
Run Code Online (Sandbox Code Playgroud)

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

Python 3.x解决方案

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

所以,在Python 3.x中我们有next方法而不是.next.因此,上面的代码片段变为:

import os
print(len(next(os.walk('dir_name'))[1]))
Run Code Online (Sandbox Code Playgroud)

dir_name您要查找内部目录的目录在哪里.


jon*_*rpe 5

我想你想要这样的东西:

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)
Run Code Online (Sandbox Code Playgroud)

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

30,183 files, 2,074 folders
Run Code Online (Sandbox Code Playgroud)

这与 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
Run Code Online (Sandbox Code Playgroud)

尽管更改了名称,但您计算的是相同的值(即,它是您正在使用的三个返回值中的第三个)!Python 函数不知道print list(os.walk(path))它们返回的值将被分配给什么名称(如果有的话;例如,您可以这样做),并且它们的行为肯定不会因此而改变。根据文档os.walk返回一个三元组(dirpath, dirnames, filenames),以及您为此使用的名称,例如:

for foo, bar, baz in os.walk(...):
Run Code Online (Sandbox Code Playgroud)

或者:

for all_three in os.walk(..):
Run Code Online (Sandbox Code Playgroud)

不会改变这一点。