Python 遍历目录下所有文件

Python 遍历目录下所有文件

Python 遍历目录下所有文件

在日常的编程工作中,我们经常会遇到需要遍历目录下所有文件的情况。Python作为一门强大的编程语言,提供了多种方法来实现这个功能。本文将介绍几种常见的遍历目录下所有文件的方法,并给出相应的示例代码和结果。

方法一:使用os模块的walk函数

os模块是Python提供的一个与操作系统相关的库,其中的walk函数可以用来遍历目录及其子目录下的所有文件。具体用法如下:

import os

def get_all_files(directory):
    all_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            all_files.append(os.path.join(root, file))
    return all_files

在上述代码中,我们首先定义了一个空列表all_files来保存所有文件的路径。然后,使用os.walk(directory)遍历指定目录directory下的所有文件和子目录。其中的root表示当前目录路径,dirs表示当前目录下的子目录名列表,files表示当前目录下的文件名列表。我们使用os.path.join(root, file)拼接当前目录路径和文件名,得到完整的文件路径,并将其添加到all_files列表中。最后返回all_files。下面是一个示例:

directory = 'C:/Users/username/Documents'
files = get_all_files(directory)
for file in files:
    print(file)

运行结果:

C:/Users/username/Documents/file1.txt
C:/Users/username/Documents/folder1/file2.txt
C:/Users/username/Documents/folder2/file3.txt
...

方法二:使用glob模块的glob函数

glob模块是Python提供的一个简单的文件通配符匹配库。它可以根据指定的通配符模式匹配文件并返回匹配成功的文件列表。我们可以结合os模块的一些函数,如os.path.isdir()os.path.join(),来遍历目录下所有文件。具体用法如下:

import glob
import os

def get_all_files(directory):
    all_files = []
    for file in glob.glob(os.path.join(directory, '**/*'), recursive=True):
        if os.path.isfile(file):
            all_files.append(file)
    return all_files

在上述代码中,我们使用了**/*作为通配符模式,**表示递归匹配所有子目录,*表示匹配当前目录下的所有文件。然后使用os.path.join(directory, file)拼接目录路径和文件名,对每个匹配成功的文件判断是否是一个文件(而非目录),是的话则将其添加到all_files列表中。下面是一个示例:

directory = 'C:/Users/username/Documents'
files = get_all_files(directory)
for file in files:
    print(file)

运行结果:

C:/Users/username/Documents/file1.txt
C:/Users/username/Documents/folder1/file2.txt
C:/Users/username/Documents/folder2/file3.txt
...

方法三:使用pathlib模块的Path类

pathlib模块是Python 3.4及以上版本提供的一个面向对象的路径操作库。它与os模块相比,使用更简洁且易读。我们可以通过Path类的glob方法来遍历目录下所有文件。具体用法如下:

from pathlib import Path

def get_all_files(directory):
    all_files = []
    for file in Path(directory).rglob('*'):
        if file.is_file():
            all_files.append(file)
    return all_files

在上述代码中,我们使用了Path类的rglob方法,*通配符表示匹配当前目录及其子目录下的所有文件。对于每个匹配成功的文件,我们判断其是否是一个文件(而非目录),是的话则将其添加到all_files列表中。下面是一个示例:

directory = 'C:/Users/username/Documents'
files = get_all_files(directory)
for file in files:
    print(file)

运行结果:

C:\Users\username\Documents\file1.txt
C:\Users\username\Documents\folder1\file2.txt
C:\Users\username\Documents\folder2\file3.txt
...

方法四:使用os模块的listdir函数递归遍历

除了os模块的walk函数外,还可以使用os模块的listdir函数结合递归来遍历目录下的所有文件。具体用法如下:

import os

def get_all_files(directory):
    all_files = []

    def recursive_list_files(path):
        for item in os.listdir(path):
            item_path = os.path.join(path, item)
            if os.path.isfile(item_path):
                all_files.append(item_path)
            elif os.path.isdir(item_path):
                recursive_list_files(item_path)

    recursive_list_files(directory)
    return all_files

在上述代码中,我们首先定义了一个内部函数recursive_list_files,用来递归遍历目录下的所有文件。对于每个目录下的项(文件或子目录),我们判断其是否是一个文件,是的话则将其添加到all_files列表中,否则进行递归遍历。最后返回all_files。下面是一个示例:

directory = 'C:/Users/username/Documents'
files = get_all_files(directory)
for file in files:
    print(file)

运行结果:

C:/Users/username/Documents/file1.txt
C:/Users/username/Documents/folder1/file2.txt
C:/Users/username/Documents/folder2/file3.txt
...

注意事项

在遍历目录下所有文件时,有一些注意事项需要我们考虑:

  1. 路径分隔符:Windows下使用反斜杠\作为路径分隔符,而Unix/Linux等系统使用正斜杠/。为了保证代码的跨平台性,我们可以使用os.path.join()来拼接路径,它会自动根据当前操作系统选择合适的路径分隔符。

  2. 文件过滤:在某些情况下,我们只希望遍历某个特定类型的文件,例如只遍历扩展名为.txt的文件。在遍历过程中,我们可以根据文件名或文件路径的特征来进行过滤。这可以通过字符串的endswith()方法或正则表达式来实现。

  3. 递归层级:有时我们可能只需要遍历当前目录下的文件,而不需要递归遍历子目录。在使用os模块的walk函数时,可以通过设置参数topdown=False来实现仅遍历当前目录。

通过掌握上述方法和注意事项,我们可以方便地遍历目录下的所有文件,从而更好地实现我们的编程需求。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程