您的位置:

遍历目录树的Python方法

一、os.walk()

Python提供了os.walk()方法可以方便地遍历文件夹中的所有文件。os.walk()方法需要传入一个参数rootdir,即需要遍历的文件夹的路径。它会返回一个三元的元组,其中第一个元素是当前文件夹的路径,第二个元素是当前文件夹中所有子文件夹的名称,第三个元素是当前文件夹中所有文件的名称。我们可以利用这个三元元组递归遍历整个文件夹中的所有文件和文件夹。

import os

def list_files(startpath):
    for root, dirs, files in os.walk(startpath):
        level = root.replace(startpath, '').count(os.sep)
        indent = ' ' * 4 * level
        print('{}{}/'.format(indent, os.path.basename(root)))
        subindent = ' ' * 4 * (level + 1)
        for file in files:
            print('{}{}'.format(subindent, file))
        
list_files('path/to/folder')

上面的代码会从指定的文件夹中递归遍历文件夹中的所有文件和文件夹,并打印它们的相对路径。它使用了字符串的乘法运算符 * 来生成空格,从而实现缩进的效果。

二、glob.glob()

除了os.walk()方法外,Python还提供了glob.glob()方法,可以用来匹配特定模式的文件名。它需要传入一个包含通配符的字符串,然后返回匹配该模式的所有文件名。

import glob

for file in glob.glob('path/to/folder/*'):
    print(file)

上面代码中,我们使用通配符 * 匹配了path/to/folder/文件夹中的所有文件名,并打印它们。

三、递归遍历文件夹的扩展应用

在递归遍历文件夹的基础上,我们还可以实现一些更加复杂的功能。比如,统计指定文件夹中所有文件的大小,并按照文件类型进行分类。

import os

def get_size(startpath):
    total_size = 0
    file_dict = {}
    for root, dirs, files in os.walk(startpath):
        for file in files:
            path = os.path.join(root, file)
            size = os.path.getsize(path)
            total_size += size
            ext = os.path.splitext(file)[1]
            if ext not in file_dict:
                file_dict[ext] = 0
            file_dict[ext] += size
                        
    for ext, size in file_dict.items():
        print(f"{ext}: {size/1024/1024:.2f} MB")
    print(f"Total size: {total_size/1024/1024:.2f} MB")
        
get_size('path/to/folder')

上面的代码会递归遍历文件夹并统计其中所有文件的大小,并按照文件类型进行分类和汇总。我们使用了os.path.splitext()方法来获取文件的扩展名,并使用了字典来进行文件类型和文件大小的统计。

四、完整代码示例

下面是一个完整的例子,演示了如何递归遍历文件夹并打印所有文件的相对路径:

import os

def list_files(startpath):
    for root, dirs, files in os.walk(startpath):
        level = root.replace(startpath, '').count(os.sep)
        indent = ' ' * 4 * level
        print('{}{}/'.format(indent, os.path.basename(root)))
        subindent = ' ' * 4 * (level + 1)
        for file in files:
            print('{}{}'.format(subindent, file))
        
list_files('path/to/folder')

如果我们想要按文件类型分类并统计文件大小的话,可以使用如下代码:

import os

def get_size(startpath):
    total_size = 0
    file_dict = {}
    for root, dirs, files in os.walk(startpath):
        for file in files:
            path = os.path.join(root, file)
            size = os.path.getsize(path)
            total_size += size
            ext = os.path.splitext(file)[1]
            if ext not in file_dict:
                file_dict[ext] = 0
            file_dict[ext] += size
                        
    for ext, size in file_dict.items():
        print(f"{ext}: {size/1024/1024:.2f} MB")
    print(f"Total size: {total_size/1024/1024:.2f} MB")
        
get_size('path/to/folder')

这个代码会遍历指定的文件夹,并打印出其中所有文件按照后缀名分别的大小和总大小。

总结

通过本文的介绍,我们学习了Python中的两种遍历文件夹的方法,分别是os.walk()和glob.glob()方法。此外,我们还演示了递归遍历文件夹的扩展应用,并通过完整的代码示例对这些内容进行了说明。通过本文的学习,相信你已经掌握了在Python中遍历文件夹的基本方法和一些应用技巧。