python编程快速上手之第9章实践项目

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.isabs(path):
        os.path.abspath(path)  # 将路径参数转换为绝对路径

    fileRegex = re.compile('^' + prefix + r'(\d+)' + suffix + '$')  # 创建正则表达式用于提取文件名中的编号

    dictNameNum = {}  # 创建字典
    print('原始文件清单:')
    for fileName in os.listdir(path):
        mo = fileRegex.search(fileName)  # 搜索匹配的文件名
        if mo is not None:
            dictNameNum[int(mo.group(1))] = fileName  # 提取文件编号作为关键字,文件名为对应的值
            print(fileName)

    print('\n开始扫描缺失的文件编号...')
    # 循环遍历文件编号,找到缺失的文件编号,将当前最后一个文件编号对应的文件名修改为缺失的文件编号对应的文件名
    index = 1
    maxNumber = max(dictNameNum.keys())
    width = len(str(maxNumber))
    while index < maxNumber:
        if index not in dictNameNum.keys():  # 找到缺失的文件编号
            print(f'缺少文件编号:{str(index).rjust(width, "0")}')
            fileNameNew = prefix + str(index).rjust(width, '0') + suffix # 定义新文件名
            print(f'正在将 {dictNameNum[maxNumber]} 重命名为 {fileNameNew} ...')
            shutil.move(os.path.join(path, dictNameNum[maxNumber]), os.path.join(path, fileNameNew))  # 修改文件名称
            dictNameNum[index] = fileNameNew  # 增加缺失的文件编号
            del dictNameNum[maxNumber]  # 删除已改名的文件编号
            maxNumber = max(dictNameNum.keys())  # 重新计算当前最大文件编号
        index += 1

    print('缺少的文件编号已全部处理完毕!')
    print('\n打印处理后的文件清单:')
    for index in range(maxNumber):
        print(dictNameNum[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

猜你喜欢

转载自www.cnblogs.com/simonxu0559/p/11782486.html
今日推荐