os.walk()简介
我们知道,Python 中os.walk()方法是返回三个值,分别是:
1、当前文件夹名称的字符串(下面的示例中用folder变量表示);
2、当前文件夹中的子文件夹名称字符串列表((下面的示例中用subfolders变量表示);)
3、当前文件夹中的文件名称(包括子文件夹中的文件名称)字符串列表(下面的示例中用files变量表示)。
因此,可以使用os.walk()方法遍历选定的文件夹,找到指定的文件夹或文件。
具体执行过程见代码及输出结果,可以看出来 for 语句执行os.walk()方法的循环过程:
1、先列出当前文件夹下的所有文件夹及文件(文件仅限于当前文件下的文件,不包括子文件中的文件)
2、列出第一个子文件夹中的子文件夹及文件(同上)
3、列出第一个子文件夹中的子文件夹中的文件
4、列出第二个子文件夹中的子文件夹及文件(同上)
5、列出第二个子文件夹中的子文件夹中的文件
6、列出第三个子文件夹中文件(此文件再无子文件夹)
以此类推
可以从执行结果看出:
1、for循环是以当前文件夹所包含的所有文件夹(包括子文件夹、孙文件夹等)的个数为循环次数。
2、子文件夹循环是当根据子文件夹(不包括它下面的子文件夹、孙文件夹等)的个数为循环次数。
3、文件循环是根据文件夹中(不包括它下面的子文件夹、孙文件夹等中的文件)的文件个数为循环次数。
文件夹结构如下图:
代码如下:
#!python3
import tkinter as tk, os
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
#获取文件夹
SourceFolder = filedialog.askdirectory(title = '请选择要检索大文件的磁盘或文件夹:')
if len(SourceFolder) <= 0:
print('未找到文件夹!程序中止。')
sys.exit()
(a,b,c,bz,cz) = (0,0,0,0,0)
for folder, subfolders, files in os.walk(SourceFolder) : #主循环
a += 1
b = 0
c = 0
for subfolder in subfolders : #子文件夹循环
b += 1
bz += 1
print(folder +'/'+ subfolder + ' 主循环'+str(a)+' 文件夹循环'+str(b))
for file in files : #文件循环
c += 1
cz += 1
print(folder +'/'+ file + ' 主循环'+str(a)+' 文件夹循环'+str(b)+' 文件循环'+str(c))
print('主循环次数%d' % a)
print('子文件夹循环次数%d' % bz)
print('文件循环次数%d' % cz)
输出如下:
C:/test/001 主循环1 文件夹循环1
C:/test/002 主循环1 文件夹循环2
C:/test/003 主循环1 文件夹循环3
C:/test/主1.txt 主循环1 文件夹循环3 文件循环1
C:/test/主2.txt 主循环1 文件夹循环3 文件循环2
C:/test\001/00101 主循环2 文件夹循环1
C:/test\001/11.txt 主循环2 文件夹循环1 文件循环1
C:/test\001/12.txt 主循环2 文件夹循环1 文件循环2
C:/test\001/13.txt 主循环2 文件夹循环1 文件循环3
C:/test\001\00101/0010101.txt 主循环3 文件夹循环0 文件循环1
C:/test\002/00201 主循环4 文件夹循环1
C:/test\002/21.txt 主循环4 文件夹循环1 文件循环1
C:/test\002/22.txt 主循环4 文件夹循环1 文件循环2
C:/test\002\00201/0020101.txt 主循环5 文件夹循环0 文件循环1
C:/test\003/31.txt 主循环6 文件夹循环0 文件循环1
C:/test\003/32.txt 主循环6 文件夹循环0 文件循环2
主循环次数6
子文件夹循环次数5
文件循环次数11
大家觉得可以的话,可以帮忙点个赞吗?