当我们进行文件操作时,有时候需要对一个目录及其子目录下的所有文件进行操作,这就需要使用到目录遍历。
在Python中,目录遍历可以通过os模块和os.path模块实现。本文将介绍两种常见的目录遍历实例,并分析其优缺点。
一、os.walk()
os.walk()可以遍历一个目录及其子目录下的所有文件。其返回一个三元组(root, dirs, files),其中root表示当前正在遍历的目录,dirs是一个list对象,内容是该目录下所有子目录的名称,files是一个list对象,内容是该目录下所有文件的名称。
下面是一个简单的示例:
import os
def traverse_folder(dir_path):
for root, dirs, files in os.walk(dir_path):
print('root dir:', root)
print('sub dirs:', dirs)
print('files:', files)
traverse_folder('/path/to/your/folder')
以上代码会输出遍历路径下的每一个文件夹名称和文件夹下面的文件名称,可以根据实际需要做相应的操作。
优点:
1.适用于遍历大型目录;
2.返回的三元组可以充分发挥Python的优势,比如可以直接使用for循环遍历,通过os.path.join()函数拼接文件绝对路径等;
3.在遍历源数据时,可以直接用os.path.isdir()及os.path.isfile()函数判断是不是文件夹和是否是文件,很容易理解。
缺点:
1.对于深层次(多层嵌套)的目录,效率略低。
二、os.listdir()
os.listdir()可以列出指定目录下的所有文件和文件夹,但是只能遍历当前目录,并不能深层次地遍历子目录。因此,如果需要遍历多层子目录,需要对每一层目录单独调用os.listdir(),实际操作中会显得比较繁琐。
下面是一个简单的示例:
import os
def traverse_folder(dir_path):
for file in os.listdir(dir_path):
file_path = os.path.join(dir_path, file)
if os.path.isdir(file_path):
print('sub dir:', file)
elif os.path.isfile(file_path):
print('file:', file)
terse_folder('/path/to/your/folder')
优点:
1.适用于遍历简单的目录结构;
2.在遍历源数据时,可以直接用os.path.isdir()及os.path.isfile()函数判断是不是文件夹和是否是文件,很容易理解。
缺点:
1.只能遍历当前目录,不能深层次地遍历子目录。
2.对于深层次(多层嵌套)的目录,需要多次调用函数,操作繁琐,效率低下。
结论
从上述两种方式,可以发现,os.walk()具有更好的扩展性和可用性,比较适用于对大型且深层次的目录进行遍历;而os.listdir()则适合针对简单的目录结构进行遍历。
尽管两种方法都可以实现目录遍历,但因为os.walk()可以充分利用Python自身的优势,灵活性更高,因此我们平时在使用时,应尽可能使用os.walk()来遍历文件夹。