揭秘Python文件遍历:轻松遍历文件夹下所有文件,掌握文件处理技巧
遍历文件夹中的所有文件
1. Python文件遍历简介
文件遍历是Python中一项基本操作,它允许您遍历文件系统中的文件和文件夹。它在许多任务中都很有用,例如文件管理、数据分析和软件开发。
Python提供了多种文件遍历函数,这些函数可以帮助您轻松高效地遍历文件系统。这些函数可以分为两类:基于os模块的函数和基于pathlib模块的函数。
2. Python文件遍历基础
2.1 os模块中的文件遍历函数
os模块提供了两个主要的文件遍历函数:os.walk()和os.listdir()。
2.1.1 os.walk()函数
os.walk()函数以生成器的方式遍历目录树,返回一个三元组(dirpath, dirnames, filenames),其中:
- dirpath:当前目录的绝对路径。
- dirnames:当前目录下的子目录列表。
- filenames:当前目录下的文件列表。
代码块:
- import os
- for root, dirs, files in os.walk("/path/to/directory"):
- print(f"Current directory: {root}")
- print("Subdirectories:", dirs)
- print("Files:", files)
逻辑分析:
代码使用os.walk()函数遍历/path/to/directory目录树。对于每个目录,它打印当前目录的路径、子目录列表和文件列表。
2.1.2 os.listdir()函数
os.listdir()函数返回指定目录下的文件和子目录列表,但它不递归遍历目录树。
代码块:
- import os
- files = os.listdir("/path/to/directory")
- print("Files in the directory:", files)
逻辑分析:
代码使用os.listdir()函数获取/path/to/directory目录中的文件和子目录列表,并将其存储在files变量中。
2.2 pathlib模块中的文件遍历函数
pathlib模块提供了两个主要的文件遍历函数:Path.glob()和Path.iterdir()。
2.2.1 Path.glob()方法
Path.glob()方法返回一个匹配指定模式的文件和目录的生成器。
代码块:
- from pathlib import Path
- path = Path("/path/to/directory")
- for file in path.glob("*.txt"):
- print(file)
逻辑分析:
代码使用Path.glob()方法获取/path/to/directory目录中所有以.txt结尾的文件。
2.2.2 Path.iterdir()方法
Path.iterdir()方法返回一个当前目录中文件和目录的迭代器。
代码块:
- from pathlib import Path
- path = Path("/path/to/directory")
- for file in path.iterdir():
- print(file)
逻辑分析:
代码使用Path.iterdir()方法获取/path/to/directory目录中的所有文件和目录。
3.1 过滤文件和文件夹
在文件遍历过程中,我们经常需要根据特定条件过滤文件和文件夹。Python提供了多种方法来实现这一目的。
3.1.1 使用lambda表达式
lambda表达式是一种匿名函数,可以作为参数传递给其他函数。在文件遍历中,我们可以使用lambda表达式来过滤文件和文件夹。
- import os
- # 过滤当前目录下的所有以.py结尾的文件
- files = [f for f in os.listdir('.') if f.endswith('.py')]
- # 过滤当前目录下的所有文件夹
- directories = [d for d in os.listdir('.') if os.path.isdir(d)]
3.1.2 使用os.path.isfile()和os.path.isdir()函数
os模块提供了os.path.isfile()
和os.path.isdir()
函数来检查文件或文件夹是否存在。我们可以使用这些函数来过滤文件和文件夹。
- import os
- # 过滤当前目录下的所有文件
- files = [f for f in os.listdir('.') if os.path.isfile(f)]
- # 过滤当前目录下的所有文件夹
- directories = [d for d in os.listdir('.') if os.path.isdir(d)]
3.2 递归遍历文件夹
在某些情况下,我们需要递归遍历文件夹,即遍历文件夹及其所有子文件夹。Python提供了多种方法来实现这一目的。
3.2.1 使用os.walk()函数的topdown参数
os.walk()函数的topdown
参数控制遍历的顺序。如果topdown
为True
,则函数将首先遍历根目录,然后遍历子目录。如果topdown
为False
,则函数将首先遍历子目录,然后遍历根目录。
- import os
- # 递归遍历当前目录及其所有子目录
- for root, directories, files in os.walk('.', topdown=True):
- for name in files:
- print(os.path.join(root, name))
3.2.2 使用pathlib.Path.rglob()方法
pathlib模块提供了Path.rglob()
方法,可以递归遍历文件夹及其所有子文件夹。
- from pathlib import Path
- # 递归遍历当前目录及其所有子目录
- for file in Path('.').rglob('*'):
- print(file)
4. Python文件遍历实践应用
在掌握了Python文件遍历的基础和高级技巧后,让我们探讨一下其在实际应用中的用法。
4.1 文件复制和移动
文件复制和移动是文件遍历中常见的操作。
4.1.1 使用shutil模块
shutil模块提供了用于文件复制和移动的函数。
- import shutil
- # 复制文件
- shutil.copyfile('source_file.txt', 'destination_file.txt')
- # 移动文件
- shutil.move('source_file.txt', 'destination_file.txt')
4.1.2 使用os模块
os模块也提供了文件复制和移动的函数。
- import os
- # 复制文件
- os.system('cp source_file.txt destination_file.txt')
- # 移动文件
- os.system('mv source_file.txt destination_file.txt')
4.2 文件搜索和查找
文件搜索和查找是另一个常见的应用。
4.2.1 使用glob模块
glob模块提供了用于查找文件和文件夹的函数。
- import glob
- # 查找所有.txt文件
- files = glob.glob('*.txt')
4.2.2 使用fnmatch模块
fnmatch模块提供了用于匹配文件和文件夹名称的函数。
- import fnmatch
- # 查找所有以'file'开头的文件
- files = fnmatch.filter(os.listdir(), 'file*')
4.3 文件重命名
文件重命名也是一个常见的操作。
- import os
- # 重命名文件
- os.rename('old_name.txt', 'new_name.txt')
4.4 文件删除
文件删除也是一个常见操作。
- import os
- # 删除文件
- os.remove('file.txt')
4.5 文件创建
文件创建也是一个常见操作。
- import os
- # 创建文件
- with open('new_file.txt', 'w') as f:
- f.write('Hello world!')
4.6 文件读取
文件读取也是一个常见操作。
- import os
- # 读取文件
- with open('file.txt', 'r') as f:
- data = f.read()
4.7 文件写入
文件写入也是一个常见操作。
- import os
- # 写入文件
- with open('file.txt', 'w') as f:
- f.write('Hello world!')
5. Python文件遍历性能优化
5.1 避免不必要的遍历
在某些情况下,可以避免不必要的遍历操作,从而提高性能。
5.1.1 使用os.path.exists()
函数
os.path.exists()
函数可以检查给定路径是否存在,而不进行遍历操作。这对于确定文件或文件夹是否存在很有用,从而避免不必要的遍历。
- import os
- # 检查文件是否存在
- if os.path.exists("myfile.txt"):
- # 文件存在,执行操作
- else:
- # 文件不存在,执行其他操作
5.1.2 使用os.path.getsize()
函数
os.path.getsize()
函数可以获取文件的大小,而不进行遍历操作。这对于确定文件是否为空或大小是否符合预期很有用,从而避免不必要的遍历。
- import os
- # 检查文件是否为空
- if os.path.getsize("myfile.txt") == 0:
- # 文件为空,执行操作
- else:
- # 文件不为空,执行其他操作
5.2 并行遍历文件夹
对于大型文件夹,并行遍历可以显著提高性能。
5.2.1 使用multiprocessing
模块
multiprocessing
模块提供了一个Pool
类,可以创建多个进程并行执行任务。
- import multiprocessing
- # 创建一个进程池
- pool = multiprocessing.Pool()
- # 获取文件夹中的所有文件
- files = pool.map(os.listdir, ["文件夹1", "文件夹2", "文件夹3"])
- # 关闭进程池
- pool.close()
- pool.join()
5.2.2 使用concurrent.futures
模块
concurrent.futures
模块提供了一个ThreadPoolExecutor
类,可以创建多个线程并行执行任务。
- import concurrent.futures
- # 创建一个线程池
- executor = concurrent.futures.ThreadPoolExecutor()
- # 获取文件夹中的所有文件
- files = list(executor.map(os.listdir, ["文件夹1", "文件夹2", "文件夹3"]))