Python-装饰器-案例-获取文件列表
1 import os 2 3 4 def get_all_path(fun): 5 '''装饰器。功能:获取全路径文件名。如:D:/tmp/12.txt 6 :param fun: 7 :return:file_path_list 全路径文件名列表 8 ''' 9 10 def inner(r): 11 # print("获取全路径文件名") 12 file_name_list = fun(r) 13 file_path_list = [] 14 for file in file_name_list: 15 path_file = refer_path + os.sep + file 16 file_path_list.append(path_file) 17 return file_path_list 18 19 return inner 20 21 22 def get_pdf(fun): 23 '''装饰器。功能:获取后缀为pdf、PDF的文件名列表 24 :param fun: 25 :return: file_pdf_list后缀为pdf、PDF的文件名列表 26 ''' 27 28 def inner(r): 29 # print("获取后缀为.pdf的文件名列表") 30 file_name_list = fun(r) 31 file_pdf_list = [] 32 for file in file_name_list: 33 ext = os.path.splitext(file)[1] 34 if ext.lower() == '.pdf': # 判断后缀是否为.pdf、.PDF 35 file_pdf_list.append(file) 36 return file_pdf_list 37 38 return inner 39 40 41 def get_suffix_out(suf="txt"): 42 '''装饰器。功能:获取后缀为指定后缀(suf)的文件名列表 43 :param suf:指定后缀,如:txt、jpg 44 :return:suf_list符合指定后缀的文件列表 45 ''' 46 47 def get_suffix(fun): 48 def inner(*args, **kwargs): 49 # print("inner 后缀限制是:", suf) 50 # # print("获取后缀为.pdf的文件名列表") 51 file_name_list = fun(*args, **kwargs) 52 suf_list = [] 53 for file in file_name_list: 54 src_suf = os.path.splitext(file)[1] # 获取文件的后缀,如:.pdf、.txt 55 if src_suf.lower() == '.' + str(suf).lower(): # 判断后缀是否为.suf、.SUF 56 suf_list.append(file) 57 return suf_list 58 59 return inner 60 61 return get_suffix 62 63 64 def get_papers_only(fun): 65 '''装饰器。功能:只获取列表中的文件名。不含文件夹。如:1.txt、123.pdf 66 :param fun: 67 :return: file_name_only_list 只有文件名,不含文件夹的列表 68 ''' 69 70 def inner(r): 71 # print("只获取文件名,不含文件夹") 72 file_name_list = fun(r) 73 # 只获取文件名,不含文件夹列表。如:1.txt、123.pdf 74 file_name_only_list = [] 75 for file in file_name_list: 76 if os.path.isabs(file): # 1、如果为绝对路径,r表示绝对路径全路径列表 77 if not os.path.exists(file): # 检查全路径的有效性 78 print("路径不存在") 79 exit() 80 if os.path.isfile(file): # 判断是否为文件(非文件夹) 81 file_name_only_list.append(file) 82 else: # 2、如果为相对路径,r表示相对路径统一路径字符串 83 path_file = r + os.sep + file 84 if not os.path.exists(path_file): # 检查全路径的有效性 85 print("路径不存在") 86 exit() 87 if os.path.isfile(path_file): # 判断是否为文件(非文件夹) 88 file_name_only_list.append(file) 89 return file_name_only_list 90 91 return inner 92 93 94 # 巧用装饰器做过滤条件 95 @get_all_path # 获取全路径文件列表。如:[D:\tmp\123.pdf] 96 @get_pdf # 获取pdf后缀列表。如:[123.pdf] 97 @get_papers_only # 只获取文件列表,不含文件夹。如:[a、b、1.txt、123.pdf] 98 def get_list(refer_path): 99 '''获取指定路径下的所有文件列表(含文件夹)。如:a、b、1.txt、123.pdf 100 :param refer_path: 指定存放文件的路径 101 :return:路径下的所有文件名 102 ''' 103 try: 104 file_name_list = os.listdir(refer_path) 105 return file_name_list 106 except Exception as e: 107 print(e) 108 exit() 109 110 111 @get_papers_only # 只获取文件列表,不含文件夹。如:[a、b、1.txt、123.pdf] 112 @get_suffix_out("txt") # 只获取txt后缀列表。如:[D:\tmp\123.txt] 113 # @get_pdf # 只获取pdf后缀列表。如:[D:\tmp\123.pdf] 114 def all_path(all_path_list): 115 return all_path_list 116 117 118 if __name__ == '__main__': 119 # 指定路径 120 refer_path = r'D:\tmp' 121 # 文件名称列表 122 file_name_list = get_list(refer_path) 123 print(file_name_list) 124 125 path_list = ['D:\\tmp\\123.PDF', 126 'D:\\tmp\\combinedminutes.txt', 127 'D:\\tmp\\mark.pdf', 128 'D:\\tmp\\meetingminutes.ps', 129 'D:\\tmp\\meetingminutes2.123', 130 'D:\\tmp\\rotatedpage.pdf', 131 'D:\\tmp\\watermarkedCover.pdf'] 132 133 print(path_list) 134 pdf_list = all_path(path_list) 135 print(pdf_list)
==================优美的分割线==================
装饰器学习案例:
例子1:简单装饰器
1 def check(fun): 2 def inner(): 3 print("权限检查--1") 4 fun() 5 6 return inner 7 8 9 @check 10 def foo1(): 11 print("查看用户信息") 12 13 14 if __name__ == '__main__': 15 foo1()
例子2:被装饰函数待有参数的装饰器
1 def check(fun): 2 def inner(*args, **kwargs): 3 print("权限检查--1") 4 fun(*args, **kwargs) 5 6 return inner 7 8 9 @check 10 def foo1(): 11 print("查看用户信息") 12 13 14 if __name__ == '__main__': 15 foo1()
例子3:装饰器带参数的装饰器
1 def check_out(who): 2 def check(fun): 3 def inner(*args, **kwargs): 4 print("权限检查--1,部门时:%s" % who) 5 fun(*args, **kwargs) 6 7 return inner 8 9 return check 10 11 12 @check_out("天猫") 13 def foo1(a, b): 14 print("查看用户信息%s" % (a + b)) 15 16 17 @check_out("闲鱼") 18 def foo2(a, b, c): 19 print("查看用户信息%s" % (a + b + c)) 20 21 22 if __name__ == '__main__': 23 foo1(1, 2) 24 foo2(1, 2,3)
例子4:类语法版本的装饰器
1 class MyClass(object): 2 def __init__(self, fun): 3 print('__init__函数:fun=', fun) 4 self.fun = fun 5 6 def __call__(self, *args, **kwargs): 7 print("验证权限") 8 return self.fun(*args, **kwargs) 9 10 11 @MyClass 12 def foo1(a, b): 13 print("%s + %s = %s" % (a, b, (a + b))) 14 15 16 if __name__ == '__main__': 17 foo1(1,2)
例子5:文档恢复为被装饰器的文档的装饰器
1 import functools 2 3 def check(fun): 4 """检查权限的装饰器""" 5 @functools.wraps(fun) 6 def inner(*args, **kwargs): 7 """这里是闭包函数""" 8 print("权限检查--1") 9 fun(*args, **kwargs) 10 11 return inner 12 13 @check 14 def foo1(): 15 '''这里是原始函数foo1的说明文档''' 16 print("查看用户信息") 17 18 if __name__ == '__main__': 19 print(foo1.__doc__)