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


利用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>


分享到:


相關文章: