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

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章实践项目答案)