• 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

  • 相关阅读:
    75分以下是文盲
    罗永浩最近怎么了
    北京奥运会赛事项目竞赛日程表
    从今天开始我的blog增加计数器
    07工作总结
    五道脑筋测试题,全答对的是天才
    转:国家名字的含义
    我的新装备双狂
    上海海鲜自助:喜多屋vs古象大酒店
    因为有了爱
  • 原文地址:https://www.cnblogs.com/andy9468/p/9996464.html
Copyright © 2020-2023  润新知