利用Python搞點實用的——批量複製文件



python擁有強大的文件讀寫功能與文件/夾操作功能(os,shutil庫),可以實現批量重命名,批量複製等操作。

下面定義了一個mycopy函數,可以指定複製份數,複製目錄:

<code>def mycopy(file_name,new_name='',new_path='',num=1): '''file_name:The file you want to copy! new_name:new name of copied file. new_path:where to store the new name,defaut:the same dir. num:number of the new_file you want to copy.''' import os a=os.path.splitext(file_name) dirname=os.path.dirname(file_name) #獲取文件所在文件夾路徑,如果file_name是相對路徑則為空 basename=a[0].replace(dirname,'') #獲取具體文件名稱,不包含路徑和擴展名 extname=a[1] #獲取擴展名 if new_name=='': new_name=basename #默認為原文件名稱 try: with open(file_name,'rb') as f1: content=f1.read() for i in range(1,num+1): path=os.path.join(new_path,new_name+str(i))+extname #名字+序號為複製後文件名 f=open(path,'wb') f.write(content) f.close() except FileNotFoundError: print('No such file or direct!Is your path/name right?') except IOError: print('Can\'t open the file.') else: print('Finish') mycopy('test.txt','data',num=5) #複製工作目錄下的test.txt,當然也支持絕對路徑,新名為data+序號.txt/<code>

不過似乎每次要將文件全部加載於內存,對大文件來說似乎不怎麼友好,只作為文件讀寫的練習。實際上可以使用shutil中的copyfile函數,下面是一個簡單實現:

<code>def mycopy(file_name,new_name='',new_path='',num=1): import os from shutil import copyfile a=os.path.splitext(file_name) dirname=os.path.dirname(file_name) #獲取文件所在文件夾路徑,如果file_name是相對路徑則為空 basename=a[0].replace(dirname,'') #獲取具體文件名稱,不包含路徑和擴展名 extname=a[1] #獲取擴展名 if new_name=='': new_name=basename #默認為原文件名稱 for i in range(1,num+1): path=os.path.join(new_path,new_name+str(i))+extname copyfile(file_name,path) #你也可以使用更一般的copytree方法/<code>

當然,你如果對複製後的文件名稱不感興趣的話,你也可以批量重命名,下面實現了批量重命名一個文件夾下的文件:

<code>def rename(folder_path,name_list=[],basename=''): import os os.chdir(folder_path) #將folder_path設置為工作目錄 file_list=filter(os.path.isfile,os.listdir(folder_path)) #篩選出文件夾 if basename: #如果指明瞭一個名稱,就按名稱+序號批量重命名 i=1 for f in file_list: new_name=basename+str(i)+os.path.splitext(f)[1] os.rename(f,new_name) i+=1 else: #如果沒有指定名稱,就從namelist裡獲取 try: for f in file_list: new_name=name_list.pop(0)+os.path.splitext(f)[1] os.rename(f,new_name) except IndexError: #name_list短於file_list,只命名部分 pass except: print('Rename failed! Maybe there is a duplicate filename.') else: print('Rename finished!')/<code>