os是python用于系统操作的一个包。
通过调用os对文件夹遍历主要有两种方法:os.listdir
和os.walk
。下面分别演示两个函数的用法。
文件夹目录组织形式为:
使用os.list遍历
import os
directory = os.listdir('.')
print('------------------------------')
print('遍历文件夹,输出相对路径:')
for dir in directory:
print(dir)
print('------------------------------')
print('遍历文件夹,输出完整路径:')
for dir in directory:
print(os.path.join(os.getcwd(), dir))
print('------------------------------')
输出:
------------------------------
遍历文件夹,输出相对路径:
.idea
1
2
3
4.docx
5.docx
os_operation.py
------------------------------
遍历文件夹,输出完整路径:
H:\python_coding\.idea
H:\python_coding\1
H:\python_coding\2
H:\python_coding\3
H:\python_coding\4.docx
H:\python_coding\5.docx
H:\python_coding\os_operation.py
------------------------------
os.getcwd
:获取当前目录
上述操作其实只是遍历了文件夹的第一层,如果想要遍历该文件夹的第二层,需要使用os.path.isdir
函数来判断第一层中的元素是文件还是文件夹,如果该元素是文件夹,则再次调用os.listdir
对该元素进行遍历。代码如下:
import os
cwd = os.getcwd()
directory = os.listdir(cwd)
print('------------------------------')
print('遍历文件夹,输出完整路径:')
for dir in directory:
path = os.path.join(cwd, dir)
print(path)
if os.path.isdir(path):
#遍历子文件夹
for subdir in os.listdir(path):
subpath = os.path.join(path, subdir)
print(subpath)
print('------------------------------')
输出:
------------------------------
遍历文件夹,输出完整路径:
H:\python_coding\1
H:\python_coding\1\1_1
H:\python_coding\1\1_2
H:\python_coding\1\1_3.docx
H:\python_coding\2
H:\python_coding\3
H:\python_coding\4.docx
H:\python_coding\5.docx
H:\python_coding\os_operation.py
------------------------------
如果还想遍历文件夹的再下一层,可以再添加一个for
循环。当然,这样就显得很繁琐了,最好的方法就是写一个递归函数。
使用os.walk遍历
import os
cwd = os.getcwd()
directiory = os.walk(cwd)
for root, dirs, files in directiory:
for d in dirs:
print(os.path.join(root, d))
for file in files:
print(os.path.join(root, file))
输出:
H:\python_coding\1
H:\python_coding\2
H:\python_coding\3
H:\python_coding\4.docx
H:\python_coding\5.docx
H:\python_coding\os_operation.py
H:\python_coding\1\1_1
H:\python_coding\1\1_2
H:\python_coding\1\1_3.docx
H:\python_coding\1\1_1\1_1_1
H:\python_coding\1\1_1\1_1_2.docx
os.walk
返回的是一个三元组,遍历遵循的是广度优先搜索- 如果只使用第一个
for
循环,则可以遍历该文件夹下所有的子文件夹;同理,如果只使用第二个for
循环,则可以遍历该文件夹下所有的子文件
总结:
os.list
可用于已知文件夹组织形式的情况下,对包含特定字符的文件或者文件夹进行检索,可选择遍历多少层;os.walk
可用于不知道文件夹组织形式的情况下,只能遍历所有的子文件或者子文件夹。