美文网首页Python
《Python编程快速上手—让繁琐工作自动化》第9章实践项目答案

《Python编程快速上手—让繁琐工作自动化》第9章实践项目答案

作者: simon_xu0559 | 来源:发表于2019-11-02 11:05 被阅读0次

    9.8.1 选择性拷贝

    import os
    import shutil
    
    
    def file_extension_search(file_suffix, src_path, dst_path):
        """
        搜索指定文件夹,查找特定扩展名的文件,将他们拷贝到一个新的文件夹中。
        :param file_suffix: 文件名后缀
        :param src_path: 要搜索的文件夹
        :param dst_path: 要保存到的文件夹,如果不存在则创建一个文件夹
        :return:
        """
    
        if not os.path.isdir(src_path):
            raise Exception('路径不存在,请输入正确路径。')
        elif not os.path.isabs(src_path):
            src_path = os.path.abspath(src_path)  # 转换为绝对路径
    
        if not os.path.exists(dst_path):
            os.mkdir(dst_path)  # 要保存到的文件夹不存在时创建一个文件夹
            dst_path = os.path.abspath(dst_path)  # 转换为绝对路径
        elif not os.path.isabs(dst_path):
            dst_path = os.path.abspath(dst_path)  # 转换为绝对路径
    
        total = 0
        for current_folder, sub_folders, file_names in os.walk(src_path):
            if current_folder == dst_path:  # 如果要保存到的文件夹位于要搜索的文件夹里面,则跳过该文件夹
                continue
            count = 0
            for file_name in file_names:
                if file_name.endswith(file_suffix):
                    print(f'正在将 {file_name} 复制到 {dst_path} ...')
                    shutil.copy(os.path.join(current_folder, file_name), dst_path)  # 复制文件
                    count += 1
            if count > 0:
                print(f'{current_folder} 共有 {count} 个文件被复制.\n')
            total += count
        print(f'共计 {total} 个文件被复制到 {dst_path}')
    
    
    file_extension_search('.txt', '.', 'temp')
    

    程序运行结果

    正在将 Alice’s Adventures in Wonderland.txt 复制到 D:\Pycharm\temp ...
    正在将 test.txt 复制到 D:\Pycharm\temp ...
    正在将 testNew.txt 复制到 D:\Pycharm\temp ...
    D:\Pycharm 共有 3 个文件被复制.
    
    正在将 capitalsquiz01.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz02.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz03.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz04.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz05.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz06.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz07.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz08.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz09.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz10.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz11.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz12.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz13.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz14.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz15.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz16.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz17.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz18.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz19.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz20.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz21.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz22.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz23.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz24.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz25.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz26.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz27.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz28.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers01.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers02.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers03.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers04.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers05.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers06.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers07.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers08.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers09.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers10.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers11.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers12.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers13.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers14.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers15.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers16.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers17.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers18.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers19.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers20.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers21.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers22.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers23.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers24.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers25.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers26.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers27.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers28.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers29.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers30.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers31.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers32.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers33.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers34.txt 复制到 D:\Pycharm\temp ...
    正在将 capitalsquiz_answers35.txt 复制到 D:\Pycharm\temp ...
    D:\Pycharm\quizGenerator 共有 63 个文件被复制.
    
    共计 66 个文件被复制到 D:\Pycharm\temp
    
    Process finished with exit code 0
    

    9.8.2 删除不需要的文件

    import os
    import pprint
    
    
    def filter_larger_files(path='.', size=100):
        """
        筛选指定目录内的所有文件,将大于100MB的文件名显示出来
        :param path: 指定搜索路径,默认为当前目录
        :param size: 文件大小,默认为100MB
        :return:
        """
    
        if not os.path.isdir(path):
            raise Exception('路径不存在,请输入正确路径。')
        elif not os.path.isabs(path):
            path = os.path.abspath(path)  # 转换为绝对路径
    
        dict_file_size = {}
        for current_folder, sub_folders, file_names in os.walk(path):  # 遍历文件夹下所有文件
            for file_name in file_names:
                file_name_with_abspath = os.path.join(current_folder, file_name)
                file_size = round(os.path.getsize(file_name_with_abspath) / 1024 ** 2, 2)
                if file_size >= size:
                    dict_file_size[file_name_with_abspath] = file_size
    
        pprint.pprint(dict_file_size)
        return dict_file_size
    
    
    filter_larger_files('E:\\学习资料', 200)
    

    程序运行结果

    {'E:\\学习资料\\04.Excel\\《别怕,ExcelVBA其实很简单》视频导读第1季_ExcelHome.zip': 381.75,
     'E:\\学习资料\\04.Excel\\王佩丰Excel2010视频教程.rar': 1766.93,
     'E:\\学习资料\\04.Excel\\王佩丰视频\\【王佩丰】Excel2010基础视频教程第15讲-条件格式与公式.f4v': 270.2,
     'E:\\学习资料\\04.Excel\\王佩丰视频\\【王佩丰】Excel2010基础视频教程第2讲-格式设置.f4v': 201.55,
     'E:\\学习资料\\04.Excel\\王佩丰视频\\【王佩丰】Excel2010基础视频教程第3讲-查找与定位.f4v': 232.46,
     'E:\\学习资料\\04.Excel\\王佩丰视频\\【王佩丰】Excel2010基础视频教程第4讲-排序与筛选.f4v': 202.81}
    
    Process finished with exit code 0
    

    9.8.3 消除缺失的编号

    编写思路

    • 利用正则表达式提取出文件名中的编号,与对应的文件名构成键值对,创建字典
    • 搜索缺失的文件编号,将当前最大文件编号对应的文件名修改为缺失文件编号对应的文件名


      asdf.JPG
    import os
    import re
    import shutil
    
    
    def eliminate_missing_numbers(prefix, suffix, path='.'):
        """
        在指定文件夹中,找到所有带指定前缀的文件,诸如spam001.txt, spma002.txt等,
        并定位缺失的编号(例如存在spam001.txt和spam003.txt,但不存在spam002.txt)。
        该程序对所有后面的文件改名,消除缺失的编号
    
        :param prefix: 文件前缀
        :param suffix: 文件后缀
        :param path: 文件所在路径
        :return:
        """
    
        if not os.path.isdir(path):
            raise Exception('路径不存在,请输入正确路径。')
        elif not os.path.isabs(path):
            path = os.path.abspath(path)  # 转换为绝对路径
    
        regex = re.compile('^' + prefix + r'(\d+)' + suffix + '$')  # 创建正则表达式用于提取文件名中的编号
    
        dict_file_name = {}  # 创建字典
        print('原始文件清单:')
        for file_name in os.listdir(path):
            mo = regex.search(file_name)  # 搜索匹配的文件名
            if mo is not None:
                dict_file_name[int(mo.group(1))] = file_name  # 提取文件编号作为关键字,文件名为对应的值
                print(file_name)
    
        print('\n开始扫描缺失的文件编号...')
        # 循环遍历文件编号,找到缺失的文件编号,将当前最后一个文件编号对应的文件名修改为缺失的文件编号对应的文件名
        index = 1
        last_number = max(dict_file_name.keys())
        width = len(str(last_number))
        while index < last_number:
            if index not in dict_file_name.keys():  # 找到缺失的文件编号
                print(f'缺少文件编号:{str(index).rjust(width, "0")}')
                file_name_new = prefix + str(index).rjust(width, '0') + suffix  # 定义新文件名
                print(f'正在将 {dict_file_name[last_number]} 重命名为 {file_name_new} ...')
                shutil.move(os.path.join(path, dict_file_name[last_number]), os.path.join(path, file_name_new))  # 修改文件名称
                dict_file_name[index] = file_name_new  # 增加缺失的文件编号
                del dict_file_name[last_number]  # 删除已改名的文件编号
                last_number = max(dict_file_name.keys())  # 重新计算当前最大文件编号
            index += 1
    
        print('缺少的文件编号已全部处理完毕!')
        print('\n打印处理后的文件清单:')
        for index in range(last_number):
            print(dict_file_name[index + 1])
    
    
    eliminate_missing_numbers('capitalsquiz', '.txt', 'quizGenerator')
    

    程序运行结果

    利用第八章生成的随机测验试卷文件作为测试文件,运行结果如下:

    原始文件清单:
    capitalsquiz01.txt
    capitalsquiz03.txt
    capitalsquiz04.txt
    capitalsquiz05.txt
    capitalsquiz06.txt
    capitalsquiz08.txt
    capitalsquiz09.txt
    capitalsquiz10.txt
    capitalsquiz12.txt
    capitalsquiz13.txt
    capitalsquiz14.txt
    capitalsquiz15.txt
    capitalsquiz16.txt
    capitalsquiz18.txt
    capitalsquiz19.txt
    capitalsquiz20.txt
    capitalsquiz21.txt
    capitalsquiz22.txt
    capitalsquiz23.txt
    capitalsquiz25.txt
    capitalsquiz26.txt
    capitalsquiz27.txt
    capitalsquiz28.txt
    capitalsquiz29.txt
    capitalsquiz30.txt
    capitalsquiz31.txt
    capitalsquiz32.txt
    capitalsquiz34.txt
    capitalsquiz35.txt
    
    开始扫描缺失的文件编号...
    缺少文件编号:02
    正在将 capitalsquiz35.txt 重命名为 capitalsquiz02.txt ...
    缺少文件编号:07
    正在将 capitalsquiz34.txt 重命名为 capitalsquiz07.txt ...
    缺少文件编号:11
    正在将 capitalsquiz32.txt 重命名为 capitalsquiz11.txt ...
    缺少文件编号:17
    正在将 capitalsquiz31.txt 重命名为 capitalsquiz17.txt ...
    缺少文件编号:24
    正在将 capitalsquiz30.txt 重命名为 capitalsquiz24.txt ...
    缺少的文件编号已全部处理完毕!
    
    打印处理后的文件清单:
    capitalsquiz01.txt
    capitalsquiz02.txt
    capitalsquiz03.txt
    capitalsquiz04.txt
    capitalsquiz05.txt
    capitalsquiz06.txt
    capitalsquiz07.txt
    capitalsquiz08.txt
    capitalsquiz09.txt
    capitalsquiz10.txt
    capitalsquiz11.txt
    capitalsquiz12.txt
    capitalsquiz13.txt
    capitalsquiz14.txt
    capitalsquiz15.txt
    capitalsquiz16.txt
    capitalsquiz17.txt
    capitalsquiz18.txt
    capitalsquiz19.txt
    capitalsquiz20.txt
    capitalsquiz21.txt
    capitalsquiz22.txt
    capitalsquiz23.txt
    capitalsquiz24.txt
    capitalsquiz25.txt
    capitalsquiz26.txt
    capitalsquiz27.txt
    capitalsquiz28.txt
    capitalsquiz29.txt
    
    Process finished with exit code 0
    

    相关文章

      网友评论

        本文标题:《Python编程快速上手—让繁琐工作自动化》第9章实践项目答案

        本文链接:https://www.haomeiwen.com/subject/yqycbctx.html