Python读取文件名教程 - 5种方法详解 | Python文件操作指南
- Python
- 2025-07-25
- 1516
Python读取文件名完全指南
掌握5种高效方法读取目录中的文件名
本教程详细讲解Python中读取文件名的各种方法,包含实际代码示例和性能比较,帮助您高效处理文件操作任务
为什么需要读取文件名?
在Python开发中,读取文件名是一项常见任务,适用于多种场景:
- 批量处理文件(如图像、文档、数据文件)
- 自动化文件管理任务(重命名、移动、删除)
- 构建文件索引或目录结构
- 数据分析前的文件收集
- 监控文件夹变化
注意: 读取文件名与读取文件内容不同。本教程专注于获取文件名而非文件内容。
方法概览
os.listdir()
最基础的目录列表方法,返回指定路径下的所有文件和目录名
glob.glob()
支持通配符模式匹配,适合查找特定类型的文件
os.scandir()
Python 3.5+推荐的高效方法,可获取文件属性
pathlib.Path()
面向对象的文件路径操作,现代Python的首选
os.walk()
递归遍历目录树,获取所有子目录中的文件
方法详解与代码示例
1. 使用 os.listdir()
这是Python中最简单直接的获取文件名的方法,返回指定目录下的所有文件和子目录名称列表。
import os
# 指定目录路径
directory = './documents'
# 获取目录下所有文件和子目录名
file_list = os.listdir(directory)
# 过滤出文件(排除目录)
files_only = [f for f in file_list if os.path.isfile(os.path.join(directory, f))]
# 打印结果
print("Files in directory:")
for file in files_only:
print(file)
# 指定目录路径
directory = './documents'
# 获取目录下所有文件和子目录名
file_list = os.listdir(directory)
# 过滤出文件(排除目录)
files_only = [f for f in file_list if os.path.isfile(os.path.join(directory, f))]
# 打印结果
print("Files in directory:")
for file in files_only:
print(file)
提示: os.listdir() 返回的是相对路径的文件名。如果需要绝对路径,可以使用 os.path.join(directory, filename)
2. 使用 glob.glob()
当需要根据特定模式(如文件扩展名)过滤文件时,glob模块非常实用。
import glob
# 查找所有.txt文件
txt_files = glob.glob('./documents/*.txt')
# 递归查找所有子目录中的.jpg文件
jpg_files = glob.glob('./documents/**/*.jpg', recursive=True)
# 只获取文件名(不带路径)
file_names = [os.path.basename(path) for path in txt_files]
print("Text files found:")
print(file_names)
# 查找所有.txt文件
txt_files = glob.glob('./documents/*.txt')
# 递归查找所有子目录中的.jpg文件
jpg_files = glob.glob('./documents/**/*.jpg', recursive=True)
# 只获取文件名(不带路径)
file_names = [os.path.basename(path) for path in txt_files]
print("Text files found:")
print(file_names)
3. 使用 os.scandir() (Python 3.5+)
os.scandir() 相比 listdir() 更高效,特别在需要文件类型或属性信息时。
import os
directory = './documents'
# 使用scandir()遍历目录
with os.scandir(directory) as entries:
file_names = [entry.name for entry in entries if entry.is_file()]
print("Files using scandir:")
print(file_names)
directory = './documents'
# 使用scandir()遍历目录
with os.scandir(directory) as entries:
file_names = [entry.name for entry in entries if entry.is_file()]
print("Files using scandir:")
print(file_names)
性能优势: 对于大型目录,os.scandir() 比 os.listdir() 更快,因为它返回的是包含文件信息的DirEntry对象。
4. 使用 pathlib.Path() (Python 3.4+)
pathlib提供了面向对象的文件路径操作,是现代Python文件操作的首选。
from pathlib import Path
# 创建Path对象
folder = Path('./documents')
# 获取所有文件名
all_files = [f.name for f in folder.iterdir() if f.is_file()]
# 获取特定扩展名的文件
pdf_files = [f.name for f in folder.glob('*.pdf')]
# 递归查找所有.py文件
python_files = [str(f) for f in folder.rglob('*.py')]
print("PDF Files:")
print(pdf_files)
# 创建Path对象
folder = Path('./documents')
# 获取所有文件名
all_files = [f.name for f in folder.iterdir() if f.is_file()]
# 获取特定扩展名的文件
pdf_files = [f.name for f in folder.glob('*.pdf')]
# 递归查找所有.py文件
python_files = [str(f) for f in folder.rglob('*.py')]
print("PDF Files:")
print(pdf_files)
面向对象优势: pathlib将文件路径表示为对象,使代码更简洁、易读且跨平台兼容。
5. 使用 os.walk() 遍历目录树
当需要递归处理目录及其所有子目录时,os.walk() 是最佳选择。
import os
# 遍历目录树
all_files = []
for root, dirs, files in os.walk('./project'):
# 处理当前目录中的文件
for file in files:
# 获取文件相对路径
file_path = os.path.join(root, file)
all_files.append(file_path)
# 只显示前10个文件
print("First 10 files in directory tree:")
for file in all_files[:10]:
print(file)
# 遍历目录树
all_files = []
for root, dirs, files in os.walk('./project'):
# 处理当前目录中的文件
for file in files:
# 获取文件相对路径
file_path = os.path.join(root, file)
all_files.append(file_path)
# 只显示前10个文件
print("First 10 files in directory tree:")
for file in all_files[:10]:
print(file)
方法比较
方法 | 递归能力 | 文件属性 | 模式匹配 | Python版本 | 性能 |
---|---|---|---|---|---|
os.listdir() | ❌ | ❌ | ❌ | 所有版本 | 中等 |
glob.glob() | ✅ (with **) | ❌ | ✅ | 所有版本 | 良好 |
os.scandir() | ❌ | ✅ | ❌ | 3.5+ | 优秀 |
pathlib.Path | ✅ (rglob) | ✅ | ✅ | 3.4+ | 良好 |
os.walk() | ✅ | ✅ | ❌ | 所有版本 | 中等(大型目录) |
应用场景建议
简单文件列表
对于不需要递归的小型目录,使用 os.listdir() 或 os.scandir() 是最直接的选择。
模式匹配查找
当需要查找特定扩展名或模式的文件时,使用 glob.glob() 或 pathlib.Path.glob()。
递归目录遍历
对于需要处理嵌套目录的场景,使用 os.walk() 或 pathlib.Path.rglob()。
高性能需求
在需要处理大量文件且性能关键的场景,优先选择 os.scandir()。
现代Python项目
在新项目中,推荐使用面向对象的 pathlib 模块,它提供了更Pythonic的API。
本文由ZhongliJie于2025-07-25发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20256477.html
发表评论