1. 程式人生 > >Python-裝飾器-案例-獲取檔案列表

Python-裝飾器-案例-獲取檔案列表

import os


def get_file_path(fun):
    '''裝飾器:獲取全路徑檔名。如:D:/tmp/12.txt
    :param fun:
    :return:file_path_list  全路徑檔名列表
    '''

    def inner(r):
        # print("獲取全路徑檔名")
        file_name_list = fun(r)
        file_path_list = []
        for file in file_name_list:
            path_file = refer_path + os.sep + file
            file_path_list.append(path_file)
        return file_path_list

    return inner


def get_file_pdf(fun):
    '''裝飾器。功能:獲取字尾為pdf、PDF的檔名列表
    :param fun:
    :return: file_pdf_list字尾為pdf、PDF的檔名列表
    '''

    def inner(r):
        # print("只獲取字尾為.pdf的檔名列表")
        file_name_list = fun(r)
        file_pdf_list = []
        for file in file_name_list:
            ext = os.path.splitext(file)[1]
            if ext.lower() == '.pdf':  # 判斷後綴是否為.pdf、.PDF
                file_pdf_list.append(file)
        return file_pdf_list

    return inner


def get_file_only(fun):
    '''裝飾器。功能:只獲取列表中的檔名。不含資料夾。如:1.txt、123.pdf
    :param fun:
    :return: file_name_only_list 只有檔名,不含資料夾的列表
    '''

    def inner(r):
        # print("只獲取檔名,不含資料夾")
        file_name_list = fun(r)
        # 只獲取檔名,不含資料夾列表。如:1.txt、123.pdf
        file_name_only_list = []
        for file in file_name_list:
            if os.path.isfile(file):  # 判斷是否為檔案(非資料夾)
                file_name_only_list.append(file)
        return file_name_only_list

    return inner


# 巧用裝飾器做過濾條件
@get_file_path  # 只獲取全路徑檔案列表。如:[D:\tmp\123.pdf]
@get_file_pdf  # 只獲取pdf字尾列表。如:[123.pdf]
@get_file_only  # 只獲取檔案列表,不含資料夾。如:[a、b、1.txt、123.pdf]
def get_file_list(refer_path):
    '''獲取指定路徑下的所有檔案列表(含資料夾)。如:a、b、1.txt、123.pdf
    :param refer_path: 指定存放檔案的路徑
    :return:路徑下的所有檔名
    '''
    file_name_list = os.listdir(refer_path)
    return file_name_list


if __name__ == '__main__':
    # 指定路徑
    refer_path = r'D:\tmp'
    # 檔名稱列表
    file_name_list = get_file_list(refer_path)
    print(file_name_list)