0
点赞
收藏
分享

微信扫一扫

学习笔记《Python编程快速上手》实践 9.8.3 消除缺失的编号

一只1994 2022-03-12 阅读 49

9.8.3 消除缺失的编号

编写一个程序,在一个文件夹中,找到所有带指定前缀的文件,诸如 spam001.txt,spam002.txt 等,并定位缺失的编号(例如存在 spam001.txt 和 spam003.txt,但不存在 spam002.txt)让该程序对所有后面的文件改名,消除缺失的编号.

作为附加的挑战,编写另一个程序,在一些连续编号的文件中,空出一些编号,以便加入新的文件.

  1. 文件 spam001.txt 中的 001 效果,用 str(i).zfill(3) 来实现。
  2. 用re来查找匹配的文件和序号分成存放文件名和序号
  3. 用for i in range(len(files_name_list)) 来匹配是否有对应序号,有的跳过。
  4. 没有的直接用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")
举报

相关推荐

0 条评论