9.8.3 消除缺失的编号
编写一个程序,在一个文件夹中,找到所有带指定前缀的文件,诸如 spam001.txt,spam002.txt 等,并定位缺失的编号(例如存在 spam001.txt 和 spam003.txt,但不存在 spam002.txt)让该程序对所有后面的文件改名,消除缺失的编号.
作为附加的挑战,编写另一个程序,在一些连续编号的文件中,空出一些编号,以便加入新的文件.
- 文件 spam001.txt 中的 001 效果,用 str(i).zfill(3) 来实现。
- 用re来查找匹配的文件和序号分成存放文件名和序号
- 用for i in range(len(files_name_list)) 来匹配是否有对应序号,有的跳过。
- 没有的直接用files_number_list[i]直接定位需要重命名的文件,用i+1来重新命名。
# 9.8.3 消除缺失的编号
# 编写一个程序,在一个文件夹中,找到所有带指定前缀的文件,诸如 spam001.txt,spam002.txt 等,
# 并定位缺失的编号(例如存在 spam001.txt 和 spam003.txt,但不存在 spam002.txt).
# 让该程序对所有后面的文件改名,消除缺失的编号.
# 作为附加的挑战,编写另一个程序,在一些连续编号的文件中,空出一些编号,以便加入新的文件.
import random,re,os,shutil
#生成连续的编号文件,随机空出一些编号
def create_files(path,number=10,files_start_name="编号",ext_name="txt"):
lost_files = []
for i in range(number//3):
lost_files.append(random.randint(1,10))
for i in range(1,number+1):
#生成 001 002 类似文件名
file_number = str(i).zfill(3)
file_name=files_start_name+file_number+"."+ext_name
if i not in lost_files:
with open(path+file_name,"w"):
pass
else:
print(file_name,"随机遗失编号的文件。")
def rename_files(path,files_start_name="编号",ext_name="txt"):
files_name_list = []
files_number_list =[]
#todo 找到所有带指定前缀,扩展名的文件
re_number="\d{3}"
regex=re.compile("^"+files_start_name+"("+re_number+")"+"\."+ext_name+"$")
for file in os.listdir(path):
if regex.search(file):
files_name_list.append(file)
files_number_list.append(int(regex.search(file).group(1)))
# todo 找到缺失的编号
for i in range(len(files_name_list)):
if files_number_list[i] == i+1:
print(f"{files_name_list[i]} 的序号是 {i+1}")
else:
#todo 按序号重命名文件
need_rename_file = os.path.join(path,files_name_list[i])
renamed_file_name = files_start_name+str(i+1).zfill(3)+"."+ext_name
renamed_file_path = os.path.join(path,renamed_file_name)
shutil.move(need_rename_file,renamed_file_path)
print(f"{files_name_list[i]} 的序号应该是{i+1}\n已经重命名为{renamed_file_name}")
path = ".\\"
# create_files(path,number=10,files_start_name="编号",ext_name="txt")
# rename_files(path,files_start_name="编号",ext_name="txt")