《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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,137评论 0 9
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,713评论 0 10
  • Zookeeper用于集群主备切换。 YARN让集群具备更好的扩展性。 Spark没有存储能力。 Spark的Ma...
    Yobhel阅读 7,232评论 0 34
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,082评论 1 32
  • 1.基本使用 1.1 数据类型 常用数据类型 Common Data Types 其他类型 Others 1.2 ...
    suwi阅读 1,324评论 0 3