1. 程式人生 > 程式設計 >Python3批量移動指定檔案到指定資料夾方法示例

Python3批量移動指定檔案到指定資料夾方法示例

引言

某人需求:以某excel中姓名資訊為名建立一系列資料夾,分別將四個資料夾中與人名對應的檔案彙總到該人名對應的資料夾中,共近200人,手工處理費時費力。

需求分解:

從excel中提取代號index和姓名資訊name
以index_name格式批量建立資料夾namefolder
分別遍歷四個資料夾及其子資料夾,將其中“檔名filename中包含姓名name”的文件移動到該人對應的新建的資料夾namefolder中

excel內容:


處理前:


處理後:


功能實現比較容易,權當記錄。

環境:Python3.6+macOS10.12.5

程式碼

# -*- coding: utf-8 -*-

import os
import shutil
import xlrd
import string

### 建立多層目錄
def mkdirs(path):
 # 去除首位空格
 path = path.strip()
 # 去除尾部 \ 符號
 path = path.rstrip("\\")

 # 判斷路徑是否存在
 # 存在  True
 # 不存在 False
 isExists = os.path.exists(path)

 # 判斷結果
 if not isExists:
  # 建立目錄操作函式
  os.makedirs(path)
  # 如果不存在則建立目錄
  print(path + ' 建立成功')
  return True
 else:
  # 如果目錄存在則不建立,並提示目錄已存在
  print(path + ' 目錄已存在')
  return False

def search_file(path,filename,newpath):
 queue = []
 queue.append(path);
 while len(queue) > 0:
  tmp = queue.pop(0)
  if (os.path.isdir(tmp)):#如果該路徑是資料夾
   for item in os.listdir(tmp):#遍歷該路徑中檔案和資料夾
    queue.append(os.path.join(tmp,item))#將所得路徑加入佇列queue
  elif (os.path.isfile(tmp)):#如果該路徑是檔案
   name = os.path.basename(tmp) # 獲取檔名
   dirname = os.path.dirname(tmp) # 獲取檔案目錄
   full_path = os.path.join(dirname,name) # 將檔名與檔案目錄連線起來,形成完整路徑
   des_path = newpath+'/'+path+'_'+name #目標路徑,將該資料夾資訊新增進最後的檔名中
   if filename in name:#匹配符合條件的檔案,也可用if(name.find(filename)!=-1):
    shutil.move(full_path,des_path)#移動檔案到目標路徑(移動+重新命名)

if __name__ == '__main__':
 #開啟excel檔案
 data=xlrd.open_workbook('名單.xlsx')
 #獲取第一張工作表(通過索引的方式)
 table=data.sheet_by_index(0)
 #datalist用來存放資料
 datalist_UNIQID=[]
 datalist_NAME=[]
 #將table中第一行的資料讀取並新增到data_list中
 datalist_UNIQID.extend(table.col_values(0))
 datalist_NAME.extend(table.col_values(2))
 #foldname = [a+'_'+b for a,b in zip(datalist_UNIQID,datalist_NAME)]
 dir_tjbg='zzz報告'
 dir_fsgz='xxx證書'
 dir_hbpx='yyy證書'
 dir_ykfs='xyz證書'
 #打印出第一行的全部資料
 for index,name in zip(datalist_UNIQID,datalist_NAME):
  foldername=index+'_'+name.strip()
  #print(foldername)
  mkdirs(foldername)
  search_file(dir_tjbg,name.strip(),foldername)
  search_file(dir_fsgz,foldername)
  search_file(dir_hbpx,foldername)
  search_file(dir_ykfs,foldername)

備忘

1. 同步遍歷兩個list

l1 = [2,2,2]
l2 = [3,3,3]
prod = [a*b for a,b in zip(l1,l2)]
print prod
# [6,6,6]
add = [a+b for a,l2)]
print add
# [5,5,5]

2. 資料夾操作

import os
import shutil

os.getcwd() # 獲取當前工作目錄,非指令碼目錄
os.listdir() # 返回指定目錄下的所有檔案和目錄,非遞迴
os.remove() # 刪除檔案
os.removedirs() #刪除目錄
os.path.isfile() # 檢驗給出的路徑是否是一個檔案
os.path.isdir() # 檢驗給出的路徑是否是一個目錄
os.path.isabs() # 判斷是否是絕對路徑
os.path.exists() # 檢驗給出的路徑是否真實存在
os.path.split() # 返回一個路徑的目錄名和檔名
os.path.splitext() # 分離副檔名
os.path.dirname() # 獲取檔案路徑名
os.path.basename() # 獲取一個絕對路徑下的檔名
os.system() # 執行shell命令
os.rename(old,new) # 重新命名檔案或目錄
os.makedirs(r"c:\python\test") # 建立多級目錄
os.mkdir("test") # 建立單個目錄
os.exit() # 終止當前程序
os.path.getsize(filename) # 獲取檔案大小
os.mknod("test.txt") # 建立空檔案

shutil.copyfile("oldfile","newfile") # oldfile和newfile都只能是檔案
shutil.copytree("olddir","newdir") # olddir和newdir都只能是目錄,且newdir必須不存在
shutil.move("oldpos","newpos") # 移動檔案或目錄
shutil.rmtree("dir") # 刪除目錄,與os.removedirs()相同
os.path.join(“home”,"me","mywork") # 路徑連線

參考

  • Python3 操作Excel檔案(讀寫)
  • Python操作excel的幾種方式–xlrd、xlwt、openpyxl(部分函式不適用於python3,如column_values改為col_values)
  • Python中zip()函式用法舉例
  • python指令碼初體驗之一鍵移動自定格式檔案
  • 每天一個python模組之檔案目錄操作-os以及shutil模組

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。