當我們在進行大量的資料分析時,常常伴隨著很多檔案,在這些檔案中不外乎會進行複製、刪除、移動、搜尋等相關動作,如何有效地針對大量資料進行處理變成是一件很重要的事,以下會介紹三個模組os、shutil、glob,我們可以藉由這個模組,解決大部份檔案處理問題,以下我們開始介紹這三個模組。
9-1 os模組
我們在處理的檔案通常會放在某一個資料夾中,每個檔案的完整路徑在檔名字錢都是一樣的,所以我們在給予檔案路徑時不希望一直重複寫相同的路徑,避免程式碼過於冗長,所以os模組中的getcwd()函數與chdir()函數可以取得目前的工作資料夾與修改工作資料夾位置,之後再撰寫程式碼時,給予檔案就直接寫檔案名稱即可。
程式碼
# 更換工作目錄
import os
print("日前工作目錄(資料夾):",os.getcwd())
os.chdir("D:/Bolg資料/Python/Python(9)")
print("修改後工作目錄(資料夾):",os.getcwd())
Python畫面
接下來os模組也提供os.path.exists(資料夾或檔案路徑)函數讓我們判斷資料夾或檔案是否存在。
程式碼
# 判斷檔案或目錄是否存在
print("在工作目錄下是否存在Dir_1:",os.path.exists("Dir_1"))
print("在Dir_1下是否存在excle_1.xlsx:",os.path.exists("Dir_1\excle_1.xlsx"))
print("在工作目錄下是否存在Dir_2:",os.path.exists("Dir_2"))
Python畫面os模組也提供查看一個資料夾底下的所有檔案與資料夾,函數為os.listdir(資料夾路徑),回傳結果為串列資料型態,如果回傳為空的串列,則代表資料夾為空。
程式碼
print("Dir_1的資料有:",os.listdir("Dir_1"))
print("Dir_1是否為空的資料夾:",not
os.listdir("Dir_1"))
print("Dir_3是否為空的資料夾:",not os.listdir("Dir_1\Dir_3"))
Python畫面
以上程式碼中,我們用了not 串列 這樣個語法來判斷串列是否為空,回傳結果為True代表為空;回傳False代表非空。其實比較簡單的寫法可以用串列長度是否為0來判斷,以上只是提供另一種判斷空串列的另一種方法。
os模組亦提供了建立/刪除資料夾的功能,函數分別為os.mkdir(資料夾路徑)與os.rmdir(資料夾路徑)。
程式碼
# 建立資料夾
os.mkdir("Dir_MK") #建立資料夾Dir_MK
Python畫面
程式碼
# 移除資料夾
if os.path.exists("delet_test"):
if not os.listdir("delet_test"):
os.rmdir("delet_test")
print("資料夾delet_test已移除")
else:
print("非空資料夾,無法移除!")
else:
print("資料夾不存在!")
Python畫面針對資料夾或檔案重新命名的功能,os模組提供了os.rename(原始路徑,重新命名後的路徑)函數。
程式碼
# 資料夾與檔案重新命名
os.rename("delet_test","delet_test_Rename")
os.rename("delet_test.txt","delet_test_Rename.txt")
Python畫面
os.walk(資料夾路徑)提供了一個遍歷給定資料夾以下的所有檔案與子資料夾,可以一次性呈現該給定資料夾的內部結構。os.walk(資料夾路徑)回傳(資料夾路徑,子資料夾,檔案)的tuple資料型態,我們可以用for迴圈將其結果一一列印出來。
程式碼
# 搜尋指定資料夾與子資料夾(os.walk)
for dirpath,subdir,files in
os.walk("Dir_1"):
print("資料夾路徑:",dirpath)
print("子資料夾串列:",subdir)
print("檔案串列:",files)
Python畫面程式碼
#利用os.walk找尋所有txt檔
import re #正則表示式
print("遍歷整個資料夾中的檔案,txt檔如下:")
for dirpath,subdir,files in os.walk("Dir_1"):
for f in files:
if not re.match(".*.txt",f) is None:
print(dirpath + '\\' + re.match(".*.txt",f).group())
Python畫面以上第二個例子我們運用了正規表示式的方式去搜尋txt檔案,模組為re,正規表示是一個在字串處理上非常有效率的工具,後面的單元會再仔細說明此模組的其他函數與用法。
9-2 os.path模組
os.path模組底下有需多方便的函數可以使用,以下介紹幾個好用的函數:
程式碼
# os.path相關函數的使用
print("回傳檔案或資料夾完整路徑:",os.path.abspath("Dir_1"))
print("回傳檔案或資料夾名稱:",os.path.basename("Dir_1\excle_1.xlsx"))
print("回傳檔案或資料夾名稱:",os.path.basename("Dir_1"))
print("回傳檔案所在的資料夾路徑:",os.path.dirname("Dir_1\excle_1.xlsx"))
print("Dir_1是否存在:",os.path.exists("Dir_1"))
print("excel_1.xlsx是否存在Dir_1中:",os.path.exists("Dir_1\excle_1.xlsx"))
print("excel_1.xlsx是否存在Dir_2中:",os.path.exists("Dir_1\Dir_2\excle_1.xlsx"))
print("excel_1.xlsx的檔案大小(KB):",os.path.getsize("Dir_1\excle_1.xlsx")/1024)
print("計算資料夾大小:",end="")
size=0
for dirpath,subdir,files in
os.walk("Dir_1"):
for f in files:
size+=os.path.getsize(dirpath + '\\' + f)/1024
print(round(size,2),end="KB")
print("Dir_1\excle_1.xlsx是否為完整路徑:",os.path.isabs("Dir_1\excle_1.xlsx"))
print("D:\Bolg資料\Python\Python(9)\Dir_1\excle_1.xlsx是否為完整路徑:",os.path.isabs("D:\Bolg資料\Python\Python(9)\Dir_1\excle_1.xlsx"))
print("Dir_1\excle_1.xlsx是否為檔案:",os.path.isfile("Dir_1\excle_1.xlsx"))
print("Dir_1\Dir_2是否為檔案:",os.path.isfile("Dir_1\Dir_2"))
print("Dir_1\Dir_2是否為資料夾:",os.path.isdir("Dir_1\Dir_2"))
print("將檔案路徑Dir_1\excle_1.xlsx分割(資料夾路徑,檔案名稱):",os.path.split("Dir_1\excle_1.xlsx"))
print("將檔案路徑Dir_1\excle_1.xlsx分割(磁碟機,資料夾路徑):",os.path.splitdrive("D:\Bolg資料\Python\Python(9)\Dir_1\excle_1.xlsx"))
Python畫面9-3 shutil 模組
shutil模組對於檔案與資料夾的複製、搬移、刪除有很好的表現,以下我們列出這些功能的相關函數。
程式碼
import shutil
#複製檔案
shutil.copy("Dir_1\excle_1.xlsx",r"C:\Users\SHENG\OneDrive\桌面") #目的地可以是資料夾,檔名不一樣亦可。
shutil.copyfile("Dir_1\excle_1.xlsx",r"C:\Users\SHENG\OneDrive\桌面\excle_1.xlsx") #目的地不可以是資料夾,檔名不一樣亦可。
Python畫面
程式碼
#刪除資料夾
shutil.rmtree(r"C:\Users\SHENG\OneDrive\桌面\Dir_1_Copy")
Python畫面
程式碼
#移動資料夾或檔案
shutil.move("Dir_1\Dir_3",r"C:\Users\SHENG\OneDrive\桌面")
shutil.move("Dir_1\excle_1.xlsx",r"C:\Users\SHENG\OneDrive\桌面")
Python畫面9-4 glob模組
我們常常需要在一個大量且複雜的檔案中找尋滿足某種條件的檔案,這時候如後有效的把那些檔案找出來便是一個非常重要的技能。glob模組提供了回傳滿足指定條件的檔案名稱串列的函數:glob.glob(路徑格式),以下我們舉例說明一下。
程式碼
import glob
print("Dir_1中所有資料夾與檔案:",glob.glob("Dir_1\*"))
print("Dir_1中的txt檔:",glob.glob("Dir_1\*.txt"))
print("Dir_1中包含數字的資料夾或檔案:",glob.glob("Dir_1\*[0-9]*"))
print("Dir_1中包含數字的檔案:",glob.glob("Dir_1\*[0-9]*.*"))
Python畫面
留言
張貼留言