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:	mp123.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:	mp123.txt]
113 # @get_pdf  # 只获取pdf后缀列表。如:[D:	mp123.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:	mp'
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)
View Code

==================优美的分割线==================

装饰器学习案例:

例子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()
View Code

例子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()
View Code

例子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)
View Code

例子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)
View Code

例子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__)
View Code

参考:https://www.cnblogs.com/andy9468/p/11137417.html

原文地址:https://www.cnblogs.com/andy9468/p/9996464.html