python批量修改文件名的实现代码

570次阅读  |  发布于5年以前

    #coding:utf-8 
    #批量修改文件名 
    import os import re import datetime 

    re_st = r'(\d+)\+\s?\((\d+)\)'
     #用于匹配旧的文件名,需含分组 re_match_old_file_name = re.compile(re_st) 
     #要修改的目录 WORKING_PATH = r'F:\Gallery'

     #---------------------------------------------------------------------- 
    def rename_fomat(name): 
      """ 
      文件重命名格式组织模块(一般修改这里就可以了) 
      NOTE:返回类型必须是unicode 
      """
      if name: 
        re_rn = re_match_old_file_name.findall(name) 
        if re_rn and re_rn != []: 
          re_rn = re_rn[0] 
          num = int(re_rn) 
          new_nm = u'NO.%04d' % ( num) 
          return new_nm 
     #---------------------------------------------------------------------- 
    def logs(error): 
      """ 
      错误记录 
      """
      log = '' 
      LOG_FILE = open(r'./log.txt', 'a') 
      live_info =""" 
    ========== 
    Time : %s 
    title : %s 
    Path : 
    %s 
    ========== 
    """ % ( 
        datetime.datetime.now(), 
        str(error['title']), 
        str(error['index']), 
      ) 
      log += live_info 
      errors = error['error_paths'] 
      for item in errors: 
        item = '%s\n' % item 
        log += item 
      log = log.encode('utf-8') 
      try: 
        LOG_FILE.write(log) 
      except IOError: 
        print u'写入日志失败'
      finally: 
        LOG_FILE.close() 
     #---------------------------------------------------------------------- 
    def rename(old, new): 
      """ 
      文件重命名模块 
      return: 
        0:rename success 
        1:the new path is exists 
        -1:rename failed 
      """
      if not os.path.exists(new): 
        try: 
          os.renames(old, new) 
          return 0
        except IOError: 
          print 'path error:', new 
          return -1
      else: 
        return 1
     #---------------------------------------------------------------------- 
    def get_dirs(path): 
      """ 
      获取目录列表 
      """
      if os.path.exists(path): 
        return os.listdir(path) 
      else: 
        return -1

     #---------------------------------------------------------------------- 
    def get_input_result(word, choice): 
      """ 
      获取正确的输入结果 
      """
      correct_result = set(choice) 
      word = '===%s?\n[in]:' % (word) 
      while True: 
        in_choice = raw_input(word) 
        if in_choice in correct_result: return in_choice 


     #---------------------------------------------------------------------- 
    def batch_rename(index, dirs = []): 
      """ 
      批量修改文件 
      """
      index = unicode(index) 
      errors = [] 
      if dirs == []: 
        dirs = get_dirs(path = index) 
      if dirs and dirs != []: 
        for item in dirs: 
          item = unicode(item) 
          new_name = rename_fomat(item) 
          if new_name : 
            old_pt = u'%s\\%s'% (index, item) 
            new_pt = u'%s\\%s'% (index, new_name) 
            res_rn = rename(old_pt, new_pt) 
            if res_rn != 0: 
              errors.append(item) 
          else: 
            errors.append(item) 
        if errors and errors != []: 
          print 'Rename Failed:'
          logs({ 
            'index': index, 
            'title': 'Rename Failed' , 
            'error_paths': errors, 
          }) 
          for i, item in enumerate(errors): 
            print item, '|', 
            if i % 5 == 4: 
              print '' 
          print '' 
      else: 
        return -1
     #---------------------------------------------------------------------- 
    def batch_rename_test(index): 
      """ 
      测试 
      返回过滤结果 
      """
      index = unicode(index) 
      errors = [] 
      correct = [] 
      dirs = get_dirs(path = index) 
      if dirs and dirs != []: 
        for x, item in enumerate(dirs): 
          item = unicode(item) 
          new_name = rename_fomat(item) 
          if new_name : 
            correct.append(item) 
            old_pt = u'%s\\%s'% (index, item) 
            new_pt = u'%s\\%s'% (index, new_name) 
            print '[%d]O: %s' % ( x + 1, old_pt) 
            print '[%d]N: %s' % ( x + 1, new_pt) 
          else: 
            errors.append(item) 
        if errors and errors != []: 
          print 'Not Match:'
          logs({ 
            'index': index, 
            'title': 'Not Match', 
            'error_paths': errors, 
          }) 
          for i, item in enumerate(errors): 
            print item, '|', 
            if i % 5 == 4: 
              print '' 
          print '' 
      return correct 
       #---------------------------------------------------------------------- 
    def manage(index): 
      """ 
      程序组织块 
      """
      file_filter = batch_rename_test(index) 
      do_choice = get_input_result( 
        word = 'Do with this(y / n)', 
        choice = ['y', 'n'] 
      ) 
      if do_choice == 'y': 
        batch_rename(index, dirs= file_filter) 
      print 'Finished !'

     if __name__ == '__main__': 
      path = WORKING_PATH 
      manage(index = path)

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8