我有一个脚本可以准确地告诉我目录中有多少文件,以及其中的子目录。但是,我也在研究识别同一目录及其子目录中有多少个文件夹......
我目前的剧本:
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
正确无误?
答案 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 枚举所有目录。