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呢?
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您要查找内部目录的目录在哪里.
我想你想要这样的东西:
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)
不会改变这一点。
| 归档时间: |
|
| 查看次数: |
15987 次 |
| 最近记录: |