python学习笔记之阶段练习

这篇博客探讨了Python编程中的两个实践问题:1. 设计一个add_log装饰器,用于记录函数调用的日志,日志信息包含时间、级别、函数名和运行时长;2. 解析文本文件,查找'restored'关键字所在行及其后续相同序号的行之间的ID值。此外,还介绍了如何合并指定目录下所有.py文件内容到一个all.py文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题:

        1. 创建add_log装饰器,被装饰的函数日志信息被记录到/var/log/python.log文件中;
        2. 日志格式为: [字符串时间] Level: 日志级别 Name: 函数名称, Runtime:xxx  Result:xxx

        [注]: 装饰器带有参数;

    import time
    import functools
    def add_log(Level):
        def write_log(fun):
            @functools.wraps(fun)      # 不会改变原函数的属性;
            def wrapper(*args, **kwargs):
                start_time = time.time()
                res = fun(*args, **kwargs)
                end_time = time.time()
                #time.ctime()  获取系统字符串时间
                with open('/var/log/python.log','a+') as file_it:
                    file_it.write("[%s] Level: %s Name: %s Runtime:%s  Result: %s" % (time.ctime(),Level,fun.__name__, end_time - start_time,res))
                return res
            return wrapper
        return write_log

    @add_log('Infor')
    def add(*args):
        time.sleep(1)
        return sum(args)
    print(add(1,2))

第二题:

这个文本文件核心有几种情况:
       序号 ID 操作者 操作行为 操作行为 操作对象
       6883 556773833 RemyMCMXI
       6880 556772838 Mindmatrix restored undeleted RemyMCMXI
       6882 556771715 RemyMCMXI
       6881 556770863 RemyMCMXI
       6880 556673938 Liua97
       6879 554350969 Epicgenius
       6880 554332653 Alex
       找到restored所在行,得到该行序号6880,然后往下读,找到第一个与其序号相同的行(liua97那行),然后记录下这两行之间所有的id值(包括restored那行),这个例子就是记录下556772838 556771715 556770863这三个id。

ID_list = list()
find_restored_flag = 0
serial_number = ''
with open('/mnt/filetest') as file_it:
    for line in file_it:
        if find_restored_flag == 1:     #只有当标志是1的时候存放序号的字符串serial_number不是空串 
            if not line.startswith(serial_number):    #下面每一行如果没有相同的序号,将改行的ID保存至ID_list中
                ID_list.append(line.split()[1])
            else:                 #下面的行中又找到的与serial_number相同的序号的行,那么就退出读取文件操作
                break
        if 'restored' in line and find_restored_flag == 0:   #找到restored的一行,标志变为1
            find_restored_flag = 1
            serial_number = line.split()[0]
            ID_list.append(line.split()[1])

print(ID_list)
第三题:

    合并指定目录下的所有.py文件的内容到一个文件中all.py文件;

import os
def SearchAbsPath(dirname):
    """
    os.walk() ,按照目录层对目录中的所有文件或文件夹进行遍历,
    每层的结果是一个三元组(root,dirs,files)()最终将所有层的的结果变为一个生成器
    root 所指的是当前正在遍历的这个文件夹的本身的地址
    dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
    topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)
    :param dirname: 需要合并文件的目录
    :return: filenames  符合要求的文件的绝对路径的列表
    """
    dirname = os.path.abspath(dirname) #将输入的目录变为绝对路径
    filenames = list()
    for root,dirs,files in os.walk(dirname, topdown=False): #扫描一层目录
        for name in files:
            filenames.append(root+os.path.sep+name) #每一个文件的绝对路径放入列表
    return filenames  
def Mergefiles(path,suffix,*args):
    """
    :param path合并内容的文件(绝对路径)
    :param suffix: 需要合并的文件的后缀
    :param args:  存放需要合并内容的文件名(绝对路径)
    :return:
    """
    with open(path,'w+') as file_it_all:
        for filename in args:
            if filename.endswith(suffix):
                with open(filename) as file_it:
                    for line in file_it:
                        file_it_all.write(line)
    print('ok!')
Mergefiles('all.py','.py',*SearchAbsPath('.'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值