Python遍历目录下xlsx文件(os、Path、Generator )
常规方法
对指定目录下的指定类型文件进行遍历,可对文件名关键字进行条件筛选
返回值为文件地址的列表
import os
# 定义一个函数,函数名字为get_all_excel,需要传入一个目录
def get_all_excel(dir):
file_list = []
for root_dir, sub_dir, files in os.walk(r'' + dir):
# 对文件列表中的每一个文件进行处理,如果文件名字是以‘xlxs’结尾就
# 认定为是一个excel文件,当然这里还可以用其他手段判断,比如你的excel
# 文件名中均包含‘res’,那么if条件可以改写为
for file in files:
# if file.endswith('.xlsx') and 'res' in file:
if file.endswith('.xlsx'):
# 此处因为要获取文件路径,比如要把D:/myExcel 和res.xlsx拼接为
# D:/myExcel/res.xlsx,因此中间需要添加/。python提供了专门的
# 方法
file_name = os.path.join(root_dir, file)
# 把拼接好的文件目录信息添加到列表中
file_list.append(file_name)
return file_list
# 获取上一级别目录中的指定文件
print(get_all_excel('.'))
更优选的,简洁的重写这个函数:
import os
from glob import glob
def get_all_excel(dir):
return glob(os.path.join(dir, "*.xlsx"))
print(get_all_excel('.'))
这样的写法更加简洁,使用 glob 库的 glob 函数可以快速获取指定目录下所有满足模式的文件。这里使用 *.xlsx 模式表示获取所有以 .xlsx 结尾的文件。
与原函数不同的是,原函数使用了 os.walk 来递归遍历指定目录下的所有文件,而重写后的函数只获取了指定目录下的文件,不会递归遍历子目录。
如果需要获取指定目录及其子目录下的所有 Excel 文件,可以使用** os.walk** 来实现:
import os
def get_all_excel(dir):
file_list = []
for root, dirs, files in os.walk(dir):
for file in files:
if file.endswith('.xlsx'):
file_list.append(os.path.join(root, file))
return file_list
print(get_all_excel('.'))
优选方法
在python3.6以后,可以使用Path更方便的操作文件
from pathlib import Path
def get_all_excel(dir, recursive=False):
dir = Path(dir).resolve()
pattern = '**/*.xlsx' if recursive else '*.xlsx'
return [str(p.resolve()) for p in dir.glob(pattern)]
通过调用get_all_excel函数便可以生成所有xlsx文件的列表,其中recursive参数为是否需要递归获取xlsx文件,默认为False,即只获取目标目录下的文件,而不包括其子目录
使用生成器的方式调用
from pathlib import Path
def get_all_excel(dir, recursive=False):
dir = Path(dir).resolve()
pattern = '**/*.xlsx' if recursive else '*.xlsx'
return (str(p.resolve()) for p in dir.glob(pattern))
# 调用函数
excel_files = get_all_excel('.', recursive=True)
# 遍历生成器并打印 Excel 文件名
for file in excel_files:
print(file)
这个示例中使用了生成器的原因是,生成器可以按需生成值,而不是在函数开始执行时立即生成所有值。这意味着如果遍历生成器时,函数才会执行,并且只有遍历到的那一项才会被生成。这使得生成器比列表更有效,因为列表将生成所有值并将它们存储在内存中,而生成器只在需要时生成值。
在这个示例中,使用生成器的一个好处是,如果有大量 Excel 文件,列表会将它们全部存储在内存中,而使用生成器可以避免这种情况。
此外,使用生成器还可以延迟执行,直到遍历到该生成器时才开始执行。这在某些情况下可能很有用,例如,如果函数在执行时需要执行计算或调用其他函数,这可能会延迟执行。
总的来说,使用生成器可以帮助提高程序的效率和性能,尤其是在处理大型数据集时。