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 文件,列表会将它们全部存储在内存中,而使用生成器可以避免这种情况。

此外,使用生成器还可以延迟执行,直到遍历到该生成器时才开始执行。这在某些情况下可能很有用,例如,如果函数在执行时需要执行计算或调用其他函数,这可能会延迟执行。

总的来说,使用生成器可以帮助提高程序的效率和性能,尤其是在处理大型数据集时。

posted @ 2020-12-20 18:39  Dapenson  阅读(2833)  评论(0编辑  收藏  举报