Python遍历文件夹文件的方法有多种,常用的方法包括使用os模块、os.walk函数、glob模块和pathlib模块。 其中,os.walk函数是最灵活和强大的方法之一。它不仅可以遍历文件,还可以遍历文件夹的子文件夹,适用于复杂的目录结构。
os.walk函数可以递归地遍历文件夹及其子文件夹,适用于复杂的目录结构。os.walk函数返回一个三元组,包含当前文件夹路径、子文件夹列表和文件列表。通过遍历这些列表,可以轻松获取所有文件和文件夹的路径信息。以下是详细描述和其他方法的介绍。
一、使用os模块
1. os.listdir()方法
os模块是Python标准库的一部分,它提供了与操作系统交互的功能。os.listdir()方法可以列出指定目录中的所有文件和文件夹。
import os
def list_files(directory):
return os.listdir(directory)
directory = 'path/to/directory'
files = list_files(directory)
for file in files:
print(file)
在上述代码中,os.listdir()方法返回一个包含目录中所有文件和文件夹名称的列表。需要注意的是,这个方法不会递归地遍历子文件夹。
2. os.scandir()方法
os.scandir()方法是Python 3.5引入的一个新方法,提供了比os.listdir()更高效的目录遍历方式。它返回一个包含os.DirEntry对象的迭代器,可以更方便地获取文件属性。
import os
def list_files(directory):
with os.scandir(directory) as it:
for entry in it:
if entry.is_file():
print(entry.name)
directory = 'path/to/directory'
list_files(directory)
os.scandir()方法不仅更高效,还可以通过os.DirEntry对象直接访问文件的属性,如文件类型、大小等。
二、使用os.walk()函数
os.walk()函数是遍历目录结构的强大工具,它可以递归地遍历文件夹及其子文件夹,并返回一个三元组,包含当前文件夹路径、子文件夹列表和文件列表。
import os
def walk_directory(directory):
for root, dirs, files in os.walk(directory):
for name in files:
print(os.path.join(root, name))
directory = 'path/to/directory'
walk_directory(directory)
在上述代码中,os.walk()函数递归遍历目录结构,root变量表示当前遍历的目录路径,dirs变量表示当前目录下的子文件夹列表,files变量表示当前目录下的文件列表。通过os.path.join()函数可以获取文件的完整路径。
os.walk()函数的优势在于递归遍历文件夹及其子文件夹,适用于复杂的目录结构。
三、使用glob模块
glob模块提供了基于Unix风格路径名模式匹配的文件搜索功能。它可以使用通配符模式匹配文件和文件夹,支持递归搜索。
import glob
def glob_files(directory):
for file in glob.glob(directory + '/', recursive=True):
if os.path.isfile(file):
print(file)
directory = 'path/to/directory'
glob_files(directory)
在上述代码中,glob.glob()方法使用通配符模式匹配文件和文件夹,recursive参数指定是否递归搜索子文件夹。glob模块的优势在于支持通配符模式匹配,适用于需要根据特定模式匹配文件的场景。
四、使用pathlib模块
pathlib模块是Python 3.4引入的一个新模块,提供了面向对象的文件系统路径操作。它比os模块更直观和易用,适用于现代Python代码。
from pathlib import Path
def list_files(directory):
path = Path(directory)
for file in path.rglob('*'):
if file.is_file():
print(file)
directory = 'path/to/directory'
list_files(directory)
在上述代码中,Path对象表示文件系统路径,rglob()方法递归遍历目录结构,并返回匹配的文件和文件夹。pathlib模块的优势在于面向对象的路径操作,更加直观和易用。
五、使用第三方库
除了Python标准库,还可以使用第三方库来遍历文件夹文件。以下是一些常用的第三方库:
1. pandas库
pandas库是一个强大的数据分析库,提供了丰富的数据操作功能。虽然pandas库主要用于数据分析,但它也可以用于遍历文件夹文件。
import pandas as pd
def list_files(directory):
files = pd.Series([str(file) for file in Path(directory).rglob('*') if file.is_file()])
print(files)
directory = 'path/to/directory'
list_files(directory)
在上述代码中,pandas库的Series对象可以方便地存储和操作文件路径列表。pandas库的优势在于强大的数据操作功能,适用于需要对文件路径进行进一步分析的场景。
2. watchdog库
watchdog库是一个文件系统监控库,可以监控文件和文件夹的变化。它可以用于实时监控文件夹的变化,并执行相应的操作。
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class MyHandler(FileSystemEventHandler):
def on_modified(self, event):
print(f'File modified: {event.src_path}')
def on_created(self, event):
print(f'File created: {event.src_path}')
def on_deleted(self, event):
print(f'File deleted: {event.src_path}')
directory = 'path/to/directory'
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, directory, recursive=True)
observer.start()
try:
while True:
pass
except KeyboardInterrupt:
observer.stop()
observer.join()
在上述代码中,watchdog库的Observer对象用于监控文件和文件夹的变化,FileSystemEventHandler类用于处理文件系统事件。watchdog库的优势在于实时监控文件夹的变化,适用于需要监控文件夹变化的场景。
六、总结
Python提供了多种遍历文件夹文件的方法,包括使用os模块、os.walk函数、glob模块、pathlib模块以及第三方库。不同方法适用于不同的场景,选择合适的方法可以提高代码的可读性和效率。
- os模块:适用于简单的文件夹遍历,os.listdir()方法列出指定目录中的所有文件和文件夹,os.scandir()方法提供更高效的遍历方式。
- os.walk函数:适用于复杂的目录结构,递归遍历文件夹及其子文件夹。
- glob模块:适用于根据特定模式匹配文件,支持通配符模式匹配。
- pathlib模块:适用于现代Python代码,提供面向对象的文件系统路径操作。
- 第三方库:如pandas库适用于需要对文件路径进行进一步分析的场景,watchdog库适用于需要监控文件夹变化的场景。
通过选择合适的方法,可以高效地遍历文件夹文件,满足不同的需求。
相关问答FAQs:
1. 如何使用Python遍历文件夹中的所有文件?
使用Python中的os模块和os.walk()函数可以很方便地遍历文件夹中的所有文件。您只需要提供文件夹的路径,os.walk()函数将返回一个生成器对象,通过循环遍历该对象即可获取文件夹中的所有文件。
2. 我想要在遍历文件夹时只获取特定类型的文件,有什么方法吗?
是的,您可以在遍历文件夹时使用文件的扩展名来筛选特定类型的文件。在每次循环中,您可以使用os.path.splitext()函数来获取文件的扩展名,然后使用条件语句来判断是否符合您所需的类型。
3. 我想要遍历文件夹时包括子文件夹中的文件,有什么方法吗?
当您使用os.walk()函数遍历文件夹时,默认情况下它会递归地遍历子文件夹中的文件。这意味着您不仅会获取文件夹中的文件,还会获取子文件夹中的文件。因此,您无需额外的操作即可实现包括子文件夹中的文件的遍历。
原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/1128801