【问题标题】:Count the number of folders in a directory and subdirectories计算目录和子目录中的文件夹数
【发布时间】:2015-06-28 10:27:11
【问题描述】:

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

我当前的脚本:

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 正确?

【问题讨论】:

  • 为什么要重命名 os.walk 中的第三个返回值来得到不同的结果?
  • 因为我是 Python 新手,希望它就这么简单
  • 但这没有任何意义 - 该函数不知道您将返回的值分配给什么名称(如果有的话!)。

标签: python python-2.7 directory


【解决方案1】:

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。于是,上面的sn-p就变成了:

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

其中dir_name 是您想要找出其中有多少个目录的目录。

【讨论】:

  • 在 3.6 上崩溃并出现错误:AttributeError: 'generator' object has no attribute 'next'
  • 当然它在 Python 3.x 中会崩溃。这不是代码的问题。由于该主题是关于完全不相关的事情,因此您必须阅读 Python 3.x 和 2.7 的差异,并阅读并理解您收到的错误消息。
  • 使用[2] 给出“文件数”,[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)),例如)它们返回的值将被分配给它们,它们的行为肯定不会因此而改变.根据the documentationos.walk 返回一个三元组(dirpath, dirnames, filenames),以及您为此使用的名称,例如是否:

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

或:

for all_three in os.walk(..):

不会改变。

【讨论】:

  • 这正是我要找的,感谢您解释我失败的快速简单尝试如何不起作用!
【解决方案3】:

如果文件夹的数量感兴趣,我找到的最快方法是:

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))

注意该方法假设输入目录中只有文件夹(即没有额外的文件)

【讨论】:

  • 嗨,Tommaso,可以数一下吗?给定路径中的目录而不是子目录??
  • 嗨尼基尔!我的回答完全符合您的要求。它只计算目录(而不是子目录)。也许发布一个示例,以便我们进一步讨论
【解决方案4】:
>>> import os
>>> len(list(os.walk('folder_name')))

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

【讨论】:

  • 这将计算目录,并且包括在计数中的根path(可能需要也可能不需要) .
  • 不计算目录是你想要的吗?我测试了代码,它枚举了我指定的文件夹中的所有目录。如果你不需要根路径,你可以减去 1。
  • 1.我不是OP。 2.根据问题中的代码,他们都想要。
  • 我不知道你说的两个是什么意思。
  • 对不起:文件和文件夹/目录。
猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 2012-06-09
  • 2015-06-15
  • 2011-02-19
  • 2016-05-16
  • 2014-01-31
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多