跳到主要內容

Python筆記(9)-資料夾與檔案的處理

當我們在進行大量的資料分析時,常常伴隨著很多檔案,在這些檔案中不外乎會進行複製、刪除、移動、搜尋等相關動作,如何有效地針對大量資料進行處理變成是一件很重要的事,以下會介紹三個模組osshutilglob,我們可以藉由這個模組,解決大部份檔案處理問題,以下我們開始介紹這三個模組。

 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.copytree("Dir_1",r"C:\Users\SHENG\OneDrive\桌面\Dir_1_Copy")  #目的的資料夾無須事先新建,程式執行中會直接新建資料夾。

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畫面

留言

這個網誌中的熱門文章

RPA-Uipath筆記(1) - 如何從網路上下載資料並存至指定路徑

最近在做 RPA 相關專案時遇到了這個問題: 如何從網路上下載資料並存至指定路徑? 針對這個問題我們採取的解決方案是 先讓檔案下載到電腦的預設路徑,再將檔案移動到我們指定的資料夾 。 以下我們用下載政府公開資料平台的資料 ("https://data.gov.tw/dataset/116285") 為例, Uipath 的流程建立如下: 使用到了 Wait for Download 、 Move File 、 Delete File 三個 Activity , Wait for Download 中 Monitored folder 必須放瀏覽器中設定的下載檔案的預設路徑且關閉詢問儲存位置。 Downloaded file 則是設定一個變數名稱 downloadfile( 可自訂 ) ,此變數的資料型態是 FileInfo 。中間則放入下載的流程步驟,從下載開始到結束都會在此 Activity 中執行完畢,執行完後所下載的檔案的相關資訊都會被存放在變數 downloadfile 中。 接下來是將檔案從預設下載路徑中移至指定路徑,這裡就需要下載預設路徑與指定路徑,這兩個我們在流程一開始就建了了兩個變數 dnlo_path 、 asng_path ,寫法如下: dnlo_path = "C:\Users\" +system.Environment.UserName+ "\Downloads" system.Environment.UserName à VB 語法,代表目前電腦的使用者名稱。 asng_path = "D:\Bolg 資料 \Uipath\Uipath(1)" Move File Activity 中 From 要放入目前檔案的位置; To 則要放入檔案存放的指定的位置,但因為是要做檔案的移動,所以以上兩個路徑後面都要再加上檔案名稱,這時可以使用 downloadfile 這個變數的屬性值叫出檔案名稱( downloadfile.Name ),當檔案名稱是隨機變動的時候,非常好用。另外,特別值得注意的是, To 的部分在加上檔案名稱時,可以不用用原始檔案的名稱,這時可以同時達到修改檔名的效果。 Overwrite 的部分打勾代表再重複執行一次的時...

RPA-Uipath(2) - 字串分割(String.Split())與合併(String.join())

在資料清理中,我們常常需要對字串進行分割或合併,今天來簡單介紹 Uipath 中字串如何進行分割與合併。 1.      字串分隔 ( 單一分割符號 ) 我們首先建了一個字串變數 Str1= "Jimmy,Johnson,Shawn,Alan,Nick" ,我們現在想把這些人名一個一個切割出來,很明顯只要將 ”,” 作為分個符號就可以了。這邊我們建立一個陣列變數 Str1_Array=Str1.split(","c) ,這個陣列變數就會儲存分割出來的結果。我們接下來用 For each 與 Write Line 將陣列的每一項內容印出來,就可以知道我們分割的結果有沒有成功。 2.      字串分隔 ( 多個分割符號 ) 我們首先建了一個字串變數 Str2= "Jimmy,Johnson.Shawn Alan,Nick" ,我們現在想把這些人名一個一個切割出來,很明顯要將 ”,” 、 ”.” 、 ” “ 都作為分個符號才能完整分割。這邊我們建立一個陣列變數 Str2_Array= Str2.Split(",|.| ".ToArray()) or Str2.Split({","c,"."c," "c}) ,這個陣列變數就會儲存分割出來的結果。我們接下來用 For each 與 Write Line 將陣列的每一項內容印出來,就可以知道我們分割的結果有沒有成功。 3       字串的合併 (Array 字串元素合併 ) 我們首先建了一個字串變數 Str3_Array= {"John","Jimmy","Shawn","Alan"} ,我們現在想把這些人名中間用 ”|” 符號隔開並且變成一個字串,這裡我們是用 String.Join( 連接符號 , 陣列 ) 這個函數達到這個目的。我們建立一個變數 Str3_Join ,使 Str3_Join=String.Join("|", Str3_Array) ,此時 Str3_Join 的結果就會是 John|Jimmy|Shawn|Alan 。我們接下來用 Write...

RPA-Uipath(5)-如何讀取Mail與取得Mail的資訊

本篇主要介紹 Uipath 取得 mail 相關資訊與附件的方法,因為 mail 的種類眾多,本範例以 Gmail 為例。首先在使用 Uipath 取得 Gmail 相關資訊前須對 Google 帳戶的安全性進行兩階段驗證設定,設定方式如下: Step1. 點選 ” 管理你的 Google 帳戶 ” Step2.  點選 ” 安全性 ” à ” 兩階段驗證 ” à 點選 ” 開始使用 ” Step3.  依 Google 所提示步驟,您最後會取得一組密碼,請務必將此密碼記下。 接下來要開始使用 Uipath 擷取 mail 相關資訊,一開始我們先使用 Get Password 儲存 mail 登入的密碼,此時密碼不是使用您真正的密碼而是使用剛剛兩階段驗證後取得的密碼,並儲存於變數 password 。 接下來使用 Get IMAP Mail Messages 來取得 mail 的相關資訊,在使用 Get IMAP Mail Messages 時必須在其屬性設定區塊進行一些參數設定。 Port 欄位填入 993 , Server 欄位填入 "imap.gmail.com" , Email 欄位填入您的 Email , Password 欄位填入 變數 password , Message 欄位我們用 MailMessage 變數填入 Mail 的相關資訊都會存在 MailMessage 變數中,我們可以用 For Each 迴圈逐一取得 mail 的相關資訊。 For Each 的屬性區塊部分也需要進行一些參數設定, List of item 欄位需填入 MailMessage 變數, TypeArgument 則須設定為 System.Net.Mail.MailMessage 。 設定完成後,我們先用 Write Line 將信件的主旨印出做為測試( 這邊我們只印出前 5 封信件的主旨,可在 Get IMAP Mail Messages 的屬性區塊中 Top 欄位中設定 ),如果要印出信件主旨,需要用 item.Subject 屬性,如要印出其他資訊,我們將常用的幾個列在以下表格: 最後,有些信件會附帶一些附件,我們如何將這些物件儲存下來呢 ? 這邊只需要用到 Save Attachments 即可。我們將其放在迴圈內以下載每個有附件的 mail...