Python编程快速上手——让繁琐工作自动化第9章9.8.3消除缺失的编号


9.8.3消除缺失的编号

编写一个程序,在一个文件夹中,找到所有带指定前缀的文件,诸如 spam001.txt,spam002.txt 等,并定位缺失的编号(例如存在 spam001.txt 和 spam003.txt,但不存在 spam002.txt)。让该程序对所有后面的文件改名,消除缺失的编号。
作为附加的挑战,编写另一个程序,在一些连续编号的文件中,空出一些编号,以便加入新的文件。


一、思路

第1步:通过正则表达式匹配带指定前缀的文件名
第2步:遍历遍历路径下文件名及文件夹名的列表,取得匹配正则表达式的文件名列表,编号部分列表和文件类型部分列表。
第3步:修改编号部分列表,消除缺失的编号,组合消除缺失编号后文件名
第4步:对文件改名


二、程序

!# python3
import os
import re
import shutil


def eliminate_missing_numbers(folder, prefix):  # 编写消除缺失编号的函数,参数folder为绝对路径,参数prefix为前缀
    numbers = []  # 列表numbers记录文件名的编号部分
    files_types = []  # 列表files_types记录文件名的文件类型部分
    real_filenames = []  # 列表real_filenames记录文件名
    prefix_regex = re.compile(r'^(%s)(\d\d\d)(.*)?$' % prefix)  # 正则表达式匹配带指定前缀的文件名,第2组匹配编号部分,第3组匹配文件类型部分
    filenames = os.listdir(folder)  # 取得路径下文件名及文件夹名的列表
    for filename in filenames:  # 遍历路径下文件名及文件夹名的列表
        if os.path.isfile(filename):  # 判断是否为文件
            if prefix_regex.search(filename):  # 判断是否匹配正则表达式
                numbers.append(prefix_regex.search(filename).group(2))  # 将匹配文件名的编号部分加入numbers列表
                files_types.append(prefix_regex.search(filename).group(3))  # 将匹配文件名的文件类型部分加入files_types列表
                real_filenames.append(prefix_regex.search(filename).group())  # 将匹配的文件名加入real_filenames列表
    numbers.sort()  # 将numbers列表排序
    for i in range(len(numbers)):  # 遍历记录文件名编号部分的列表
        numbers[i] = i + int(numbers[0])  # 消除缺失的编号
    for i, j, k in zip(numbers, files_types, real_filenames):
        after_filefolder = os.path.join(folder, prefix + str(i).rjust(3, '0') + j)  # 组合消除缺失编号后的文件路径
        befroe_filefolder = os.path.join(folder, k)  # 组合消除缺失编号前的文件路径
        shutil.move(befroe_filefolder, after_filefolder)  # 对文件改名
        # print(after_filefolder)
        # print(befroe_filefolder)


eliminate_missing_numbers(r'C:\Users\simon\Desktop\python_program\python_book_two', 'capitals_quiz_answers')

PS:程序测试所用文件为“8.5项目:生成随机的测验试卷文件”代码稍作修改并人为修改部分文件名的编号部分。
生成代码可参照Python编程快速上手——让繁琐工作自动化第8章8.5项目:生成随机的测验试卷文件
修改后生成文件代码如下:

#! python3
import random

capitals = {'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix', 'Arkansas': 'Little Rock',
            'California': 'Sacramento', 'Colorado': 'Denver', 'Connecticut': 'Hartford', 'Delaware': 'Dover',
            'Florida': 'Tallahassee', 'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho': 'Boise',
            'Illinois': 'Springfield', 'Indiana': 'Indianapolis', 'Iowa': 'Des Moines', 'Kansas': 'Topeka',
            'Kentucky': 'Frankfort', 'Louisiana': 'Baton Rouge', 'Maine': 'Augusta', 'Maryland': 'Annapolis',
            'Massachusetts': 'Boston', 'Michigan': 'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi': 'Jackson',
            'Missouri': 'Jefferson City', 'Montana': 'Helena', 'Nebraska': 'Lincoln', 'Nevada': 'Carson City',
            'New Hampshire': 'Concord', 'New Jersey': 'Trenton', 'New Mexico': 'Santa Fe', 'New York': 'Albany',
            'North Carolina': 'Raleigh', 'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City',
            'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence', 'South Carolina': 'Columbia',
            'South Dakota': 'Pierre', 'Tennessee': 'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City',
            'Vermont': 'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia', 'West Virginia': 'Charleston',
            'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'}
# 创建35份不同的测验试卷和答案。
for quiz_num in range(35):
    quiz_file = open('capitals_quiz%s.txt' % str(quiz_num + 1).rjust(3,'0'), 'w')
    answer_key_file = open('capitals_quiz_answers%s.txt' % str(quiz_num + 1).rjust(3,'0'), 'w')
    quiz_file.write('Name:\n\nDate:\n\nPeriod:\n\n')
    quiz_file.write((' ' * 20) + 'State Capitals Quiz(Form %s)' % str(quiz_num + 1).rjust(3,'0'))
    quiz_file.write('\n\n')
    states = list(capitals.keys())
    random.shuffle(states)
    # 为每份试卷创建 50 个多重选择题,次序随机。
    # 为每个问题提供一个正确答案和 3 个随机的错误答案,次序随机。
    for question_num in range(50):
        correct_answer = capitals[states[question_num]]
        wrong_answers = list(capitals.values())
        del wrong_answers[wrong_answers.index(correct_answer)]
        wrong_answers = random.sample(wrong_answers, 3)
        answer_options = wrong_answers + [correct_answer]
        random.shuffle(answer_options)
        # 将测验试卷写到 35 个文本文件中。
        quiz_file.write('%s.What is the capital of %s?' % (question_num + 1, states[question_num]))
        for i in range(4):
            quiz_file.write('%s.%s\n' % ('ABCD'[i], answer_options[i]))
        quiz_file.write('\n')
        # 将答案写到 35 个文本文件中。
        answer_key_file.write('%s.%s' % (question_num + 1, 'ABCD'[answer_options.index(correct_answer)]))
    quiz_file.close
    answer_key_file.close

三、结果

让我们先来看看消除缺失编号前的文件名:

人为修改的部分文件名编号部分分别是:
28——37,
33——49,
35——84。
以下为代码末尾注释部分在for循环中两个prinf()函数

# print(after_filefolder)
# print(befroe_filefolder)

打印的结果(前者为修改前的文件名,后者为修改后的文件名):

C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers001.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers001.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers002.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers002.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers003.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers003.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers004.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers004.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers005.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers005.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers006.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers006.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers007.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers007.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers008.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers008.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers009.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers009.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers010.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers010.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers011.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers011.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers012.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers012.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers013.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers013.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers014.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers014.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers015.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers015.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers016.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers016.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers017.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers017.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers018.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers018.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers019.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers019.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers020.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers020.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers021.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers021.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers022.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers022.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers023.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers023.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers024.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers024.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers025.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers025.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers026.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers026.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers027.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers027.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers028.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers029.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers029.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers030.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers030.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers031.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers031.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers032.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers032.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers034.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers033.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers037.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers034.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers049.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers035.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers084.txt

可以看出代码可以成功消除缺失的编号。
以下为代码末尾在for循环中执行shutil.move()函数

shutil.move(befroe_filefolder, after_filefolder)  # 对文件改名

后消除缺失编号后的文件名:
在这里插入图片描述


四、附加题

1.思路
第1步:通过正则表达式匹配带指定前缀的文件名
第2步:遍历遍历路径下文件名及文件夹名的列表,取得匹配正则表达式的文件名列表,编号部分列表和文件类型部分列表。
第3步:修改编号部分列表,空出编号,组合空出编号后文件名
第4步:对文件改名
2.程序

import os
import re
import shutil



def leave_out_extra_numbers(folder, prefix):  # 编写消除缺失编号的函数,参数folder为绝对路径,参数prefix为前缀
    numbers = []  # 列表numbers记录文件名的编号部分
    files_types = []  # 列表files_types记录文件名的文件类型部分
    real_filenames = []  # 列表real_filenames记录文件名
    prefix_regex = re.compile(r'^(%s)(\d\d\d)(.*)?$' % prefix)  # 正则表达式匹配带指定前缀的文件名,第2组匹配编号部分,第3组匹配文件类型部分
    filenames = os.listdir(folder)  # 取得路径下文件名及文件夹名的列表
    for filename in filenames:  # 遍历路径下文件名及文件夹名的列表
        if os.path.isfile(filename):  # 判断是否为文件
            if prefix_regex.search(filename):  # 判断是否匹配正则表达式
                numbers.append(prefix_regex.search(filename).group(2))  # 将匹配文件名的编号部分加入numbers列表
                files_types.append(prefix_regex.search(filename).group(3))  # 将匹配文件名的文件类型部分加入files_types列表
                real_filenames.append(prefix_regex.search(filename).group())  # 将匹配的文件名加入real_filenames列表
    numbers.sort()  # 将numbers列表排序
    for i in range(len(numbers)):  # 遍历记录文件名编号部分的列表
        numbers[i] = 2 * int(numbers[i])  # 空出编号
    for i, j, k in zip(numbers[::-1], files_types[::-1], real_filenames[::-1]):
        after_filefolder = os.path.join(folder, prefix + str(i).rjust(3, '0') + j)  # 组合空出失编号后的文件路径
        befroe_filefolder = os.path.join(folder, k)  # 组合消除缺失编号前的文件路径
        shutil.move(befroe_filefolder, after_filefolder)  # 对文件改名
        # print(after_filefolder)
        # print(befroe_filefolder)


leave_out_extra_numbers(r'C:\Users\simon\Desktop\python_program\python_book_two', 'capitals_quiz_answers')

PS:只有通过逆序遍历才能正确修改所有文件,否则会出现文件总数减少的现象。
3.结果
以下为代码末尾注释部分在for循环中两个prinf()函数

# print(after_filefolder)
# print(befroe_filefolder)

打印的结果(前者为修改前的文件名,后者为修改后的文件名):

C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers070.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers035.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers068.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers034.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers066.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers033.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers064.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers032.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers062.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers031.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers060.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers030.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers058.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers029.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers056.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers028.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers054.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers027.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers052.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers026.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers050.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers025.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers048.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers024.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers046.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers023.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers044.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers022.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers042.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers021.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers040.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers020.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers038.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers019.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers036.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers018.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers034.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers017.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers032.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers016.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers030.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers015.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers028.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers014.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers026.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers013.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers024.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers012.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers022.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers011.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers020.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers010.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers018.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers009.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers016.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers008.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers014.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers007.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers012.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers006.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers010.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers005.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers008.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers004.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers006.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers003.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers004.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers002.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers002.txt
C:\Users\simon\Desktop\python_program\python_book_two\capitals_quiz_answers001.txt

Process finished with exit code 0

可以看出代码可以成功空出编号。
以下为代码末尾在for循环中执行shutil.move()函数

shutil.move(befroe_filefolder, after_filefolder)  # 对文件改名

后空出编号后的文件名:
在这里插入图片描述


五、完整程序

import os
import re
import shutil


def eliminate_missing_numbers(folder, prefix):  # 编写消除缺失编号的函数,参数folder为绝对路径,参数prefix为前缀
    numbers = []  # 列表numbers记录文件名的编号部分
    files_types = []  # 列表files_types记录文件名的文件类型部分
    real_filenames = []  # 列表real_filenames记录文件名
    prefix_regex = re.compile(r'^(%s)(\d\d\d)(.*)?$' % prefix)  # 正则表达式匹配带指定前缀的文件名,第2组匹配编号部分,第3组匹配文件类型部分
    filenames = os.listdir(folder)  # 取得路径下文件名及文件夹名的列表
    for filename in filenames:  # 遍历路径下文件名及文件夹名的列表
        if os.path.isfile(filename):  # 判断是否为文件
            if prefix_regex.search(filename):  # 判断是否匹配正则表达式
                numbers.append(prefix_regex.search(filename).group(2))  # 将匹配文件名的编号部分加入numbers列表
                files_types.append(prefix_regex.search(filename).group(3))  # 将匹配文件名的文件类型部分加入files_types列表
                real_filenames.append(prefix_regex.search(filename).group())  # 将匹配的文件名加入real_filenames列表
    numbers.sort()  # 将numbers列表排序
    for i in range(len(numbers)):  # 遍历记录文件名编号部分的列表
        numbers[i] = i + int(numbers[0])  # 消除缺失的编号
    for i, j, k in zip(numbers, files_types, real_filenames):
        after_filefolder = os.path.join(folder, prefix + str(i).rjust(3, '0') + j)  # 组合消除缺失编号后的文件路径
        befroe_filefolder = os.path.join(folder, k)  # 组合消除缺失编号前的文件路径
        shutil.move(befroe_filefolder, after_filefolder)  # 对文件改名
        # print(after_filefolder)
        # print(befroe_filefolder)


def leave_out_extra_numbers(folder, prefix):  # 编写消除缺失编号的函数,参数folder为绝对路径,参数prefix为前缀
    numbers = []  # 列表numbers记录文件名的编号部分
    files_types = []  # 列表files_types记录文件名的文件类型部分
    real_filenames = []  # 列表real_filenames记录文件名
    prefix_regex = re.compile(r'^(%s)(\d\d\d)(.*)?$' % prefix)  # 正则表达式匹配带指定前缀的文件名,第2组匹配编号部分,第3组匹配文件类型部分
    filenames = os.listdir(folder)  # 取得路径下文件名及文件夹名的列表
    for filename in filenames:  # 遍历路径下文件名及文件夹名的列表
        if os.path.isfile(filename):  # 判断是否为文件
            if prefix_regex.search(filename):  # 判断是否匹配正则表达式
                numbers.append(prefix_regex.search(filename).group(2))  # 将匹配文件名的编号部分加入numbers列表
                files_types.append(prefix_regex.search(filename).group(3))  # 将匹配文件名的文件类型部分加入files_types列表
                real_filenames.append(prefix_regex.search(filename).group())  # 将匹配的文件名加入real_filenames列表
    numbers.sort()  # 将numbers列表排序
    for i in range(len(numbers)):  # 遍历记录文件名编号部分的列表
        numbers[i] = 2 * int(numbers[i])  # 空出编号
    for i, j, k in zip(numbers[::-1], files_types[::-1], real_filenames[::-1]):
        after_filefolder = os.path.join(folder, prefix + str(i).rjust(3, '0') + j)  # 组合空出失编号后的文件路径
        befroe_filefolder = os.path.join(folder, k)  # 组合消除缺失编号前的文件路径
        shutil.move(befroe_filefolder, after_filefolder)  # 对文件改名
        # print(after_filefolder)
        # print(befroe_filefolder)


eliminate_missing_numbers(r'C:\Users\simon\Desktop\python_program\python_book_two', 'capitals_quiz_answers')
leave_out_extra_numbers(r'C:\Users\simon\Desktop\python_program\python_book_two', 'capitals_quiz_answers')

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值