一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Python 批量修改文件名的3种实现方法

时间:2014-11-22 编辑:简简单单 来源:一聚教程网

例子一

 代码如下 复制代码

python 批量修改文件名代码
view plaincopy to clipboardprint?
#!/usr/bin/env python 
#coding=utf-8 
import os,os.path 
import shutil,string 
dir = C:\test
for i in os.listdir(dir): 
    newfile = i.replace(.,_) 
    oldfullfile = dir \ i 
    newfullfile = dir \ newfile 
    print oldfullfile 
    print newfullfile 
    shutil.move(oldfullfile,newfullfile) 
    print i 


例子二,

 代码如下 复制代码

import sys, string, os, shutil
#输入目录名和前缀名,重命名后的名称结构类似prefix_0001
def RenameFiles(srcdir, prefix):
    srcfiles = os.listdir(srcdir)
    index = 1
    for srcfile in srcfiles:
        srcfilename = os.path.splitext(srcfile)[0][1:]
        sufix = os.path.splitext(srcfile)[1]
  #根据目录下具体的文件数修改%号后的值,"%04d"最多支持9999
        destfile = srcdir + "//" + prefix + "_%04d"%(index) + sufix
        srcfile = os.path.join(srcdir, srcfile)
        os.rename(srcfile, destfile)
        index += 1
srcdir = "D://Music"
prefix = "IMG_2011"
RenameFiles(srcdir, prefix)

例子三,非常完美的解决方案

一段 Python 批量修改文件名的代码分享给大家;

 代码如下 复制代码

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

热门栏目