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')