Python — pathlib 批次重新命名Excel檔

Sean Yeh
Python Everywhere -from Beginner to Advanced
13 min readOct 4, 2022
Kaohsiung, Taiwan, photo by Sean Yeh

有時候,我們會從網路上下載行銷數據資料或者是從政府機關的網站下載檔案,這些檔案常會以Excel的格式( 副檔名為xls或xlsx )存在。

時間一久,我們的電腦中,尤其是下載項目(download)資料夾中,應該會躺著不少Excel檔。這些Excel檔案通常很混亂,檔名也常常與Excel文件的內容不一致。從檔名外觀看,往往無法直接從檔名外觀「望文生義」。

此時若可以重新給這些檔案意義的名稱,賦予新的檔名。將可對於檔案的保存與再利用提供更妥善的方法。

本篇想要說明的,就是該如何批次將電腦目錄中的Excel檔案重新命名的方式。

前提知識

在進行批次重新命名Excel檔案前,應該先逐步的瞭解下面這幾項工作該如何處理:

  1. 獲取檔案路徑資訊
  2. 移動單一檔案
  3. 重新命名單一檔案
  4. 取出資料夾中所有Excel活頁簿的檔名

以下分別針對這幾項的的處理方式進行說明。

1. 獲取檔案路徑資訊

檔案一般都會放在電腦的目錄中。想要對檔案做任何的行為前,都需要知道檔案的資訊。這些資訊包括檔案的路徑、名稱以及副檔名等。

學會如何解析並獲取路徑資訊的技能,對於控制操作檔案來說,是基礎且必要的。

使用套件: pathlib

取檔案路徑的方法中,若使用os.path來取路徑的話,檔案的路徑會以純字串的方式提供給我們。但是若使用pathlib模組來取路徑的話, pathlib.Path 取出的路徑則會是一物件。

由於pathlib的Path 物件本身即自帶了多個有用的屬性。例如:parent、name、stem、suffix等屬性,讓我們可以快速獲取路徑資訊。在此我們要使用pathlib來取得這些資訊。

匯入Path類別

使用pathlib模組前,需匯入套件。在此要使用的是Path類別。因此可以透過from的語法匯入pathlib模組的Path類別。

from pathlib import Path

Path的參數中,需要指定欲處理Excel檔案的檔案路徑。

一般來說,路徑可分為絕對路徑與相對路徑。絕對路徑是指從「根目錄起算」的完整路徑;相對路徑表示「相對於目前執行程式檔案」(working file)的路徑。

file_path = Path('路徑')

parent、name、stem、suffix等屬性是pathlib模組中路徑(Path)物件的屬性,分別返回資料夾的路徑、檔案名稱、檔案的主檔名、檔案的副檔名等。使用方式如下:

#name:取檔案名稱

name屬性可以返回檔案的名稱。這個名稱包括主檔名與副檔名。

file_name = file_path.name
print(file_name)

#stem:取檔案主檔名

stem屬性可以返回檔案的主檔名。也就是副檔名圓點( . )前面的名稱。

file_stem = file_path.stem
print(file_stem)

# suffix:取檔案副檔名

透過suffix屬性可以返回檔案的副檔名。是副檔名圓點( . )後面的字串。

file_suffix = file_path.suffix
print(file_suffix)

2. 移動單一檔案:rename()

除了獲取檔案路徑資訊外,想在Python中移動檔案,一樣可以使用pathlib模組中的Path類別。Path裡面的rename函式可以將檔案從一個路徑移動到另外一個路徑。其使用方式如下:

首先,可以透過pathlib模組的Path實類別例化兩個路徑:一個是old_path,另外一個則是new_path。

在old_path這個變數中指定了原來檔案的路徑。而在new_path中的路徑則是我們想要將原來檔案移至的目的地,也就是我們希望變成的樣子。

# 匯入Path類別
from pathlib import Path
# 原路徑,指定要移動檔案的路徑
old_path = Path('原路徑')
# 新路徑,指定檔案移動的目的地路徑
new_path = Path('新路徑')

這裡需要注意的是,new_path所指定的路徑,必須「真實存在」的路徑。換句話說,在執行程式前我們必須預先建立這個路徑,讓程式可以在執行的時候找到這個路徑。

此外,在新路徑中不可以存在與我們準備搬移檔案「一樣名稱」的檔案。也就是說不可以「撞衫」,否則程式執行時會出現錯誤。

設定好原路徑與新路徑後,就可以透過rename函式將檔案從原路徑(old_path)移動到新路徑(new_path)。

old_path.rename(new_path)

綜合上述,移動單一檔案的完整程式碼如下面四行。若不計入匯入套件的話,只需要三行程式碼就可以完成了。

from pathlib import Pathold_path = Path('原路徑')
new_path = Path('新路徑')
old_path.rename(new_path)

3. 重新命名單一檔案

如果想要重新命名檔案的話,該如何處理呢?

實際上,對單一檔案重新命名的方法跟上面提過移動單一檔案的方法是一樣的。只要在上面新路徑的地方,使用與原路徑不一樣的檔案名稱。就可以透過rename函式將檔案重新命名。如下面程式碼的示範:

# 原路徑,指定要移動檔案的路徑
old_path = Path('路徑/a.xlsx')
# 新路徑,指定檔案移動的目的地路徑
new_path = Path('路徑/b.xlsx')

原路徑的內容與新路徑的內容只差在檔名不同,一個使用了a.xlsx而另一個則使用了b.xlsx。

換句話說,如果新路徑指定的位置與原路徑不同,且原路徑下的檔名與新路徑下面的檔名也不一樣的話,就可以將檔案從A資料夾複製到B資料夾裡面。

# 原路徑,指定要移動檔案的路徑
old_path = Path('路徑A/a.xlsx')
# 新路徑,指定檔案移動的目的地路徑
new_path = Path('路徑B/a_copy.xlsx')

如同上面的程式碼示範,只需要一個步驟,就可以同時進行重新命名檔案與移動檔案位置的兩個動作。

4. 取出資料夾中所有Excel活頁簿的檔名

目前為止,我們提到的都是針對「單一檔案」進行的各項動作。但當某個資料夾裡面有很多種不同格式的檔案,而我們只想要從這個資料夾裡面取出某種副檔名的所有檔案,該如何實現?

比方說,在電腦中的「下載」資料夾裡,躺著各式各樣不同附檔名的檔案。若要從中取出所有的Excel活頁簿,該如何做?換句話說,該如何從「下載」資料夾中取出所有副檔名為xlsx或副檔名為xls的檔案?

Path物件提供了一個glob函式。該函式可以用來尋找名稱符合指定規則的檔案與資料夾。只要透過glob函式,並結合前面的name屬性,就可以快速達到目的。

匯入與使用套件: pathlib

首先,匯入pathlib套件的Path類別。並且透過Path類別列出想要找尋檔案的資料夾路徑(例如:下載資料夾的路徑)。

from pathlib import Path# 列出目標檔案的資料夾路徑
target_folder_path = Path('下載資料夾的路徑')

取符合條件的檔案路徑

接著,透過glob函式來尋找符合指定規則的檔案。執行glob函式會將查詢的結果以路徑的方式返回給我們。

使用glob函式需要帶入參數,由於我們要尋找的標的是Excel活頁簿檔,也就是副檔名中含有xls或xlsx的檔案。因此要將規則設定為「 *.xls* 」。

files_list = target_folder_path.glob('*.xls*')

巡迴檔案路徑

完成上述的步驟後,就可以透過for loop 巡迴檔案路徑,將符合條件的名稱全部取出來,並用print將結果顯示於螢幕中。

要達成這個結果還需要先建立一個空白串列lists。這個串列是為了要將for loop巡迴的結果像籃子一樣的「搜集」起來。然後才透過print()函式將這個串列lists中的內容從籃子中顯示出來。

for迴圈針對前面「符合條件之檔案路徑」進行巡迴,也就是針對所有副檔名為xlsx的檔案路徑進行一遍又一遍的巡迴,並將這些路徑的名稱取出( file.name )後,透過append添加入前面建立的lists串列中。

# 建立空白串列,搜集檔案名稱
lists = []
# 巡迴檔案路徑
for file in files_list:
# 取出活頁簿的名稱
file_name = file.name
# 將名稱加入空白串列
lists.append(file_name)
# 印出結果
print(lists)

最後,我們將上面的各個步驟合併起來,即為完整的程式碼:

from pathlib import Path# 列出要找檔案的資料夾路徑
target_folder_path = Path('下載資料夾的路徑')
# 取得資料夾下所有副檔名為xlsx的檔案路徑
files_list = target_folder_path.glob('*.xls*')
# 建立空白串列,搜集檔案名稱
lists = []
# 巡迴檔案路徑
for file in files_list:
# 取出活頁簿的名稱
file_name = file.name
# 將名稱加入空白串列
lists.append(file_name)
# 印出結果
print(lists)

補充:Comprehension解析式語法

在此補充說明,上面for loop 巡迴檔案路徑的部分,也可以改用解析式語法來撰寫成下面的程式碼:

# 或使用解析式語法:
lists = [ f.name for f in files_list]

如果是使用解析式語法來撰寫的話,完整程式碼就可以改成下面:

from pathlib import Path# 列出要找檔案的資料夾路徑
target_folder_path = Path('下載資料夾的路徑')
# 取得資料夾下所有副檔名為xlsx的檔案路徑
files_list = target_folder_path.glob('*.xls*')
# 或使用解析式語法:
lists = [ f.name for f in files_list]
# 印出結果
print(lists)

至於解析式語法的詳細說明,可以參考下面文章:

批次重新命名多個Excel活頁簿檔案

瞭解了上述幾項工作的處理方式後,我們就可以基於上述的概念開始進行主要的作業:批次重新命名多個Excel活頁簿檔案。依照下面的順序逐步完成活頁簿的批次命名。

匯入與使用套件: pathlib

要批次重新命名檔案,首先一樣需要匯入pathlib套件的Path類別。

from pathlib import Path

列出目標檔案所在路徑

匯入pathlib套件的Path類別之後,就可以使用Path類別列出我們想要重新命名檔案的作用資料夾路徑。

target_folder_path = Path('重新命名的檔案所在的路徑')

取目標資料夾下符合條件之檔名

接著透過glob函式來尋找目標資料夾內符合指定規則的檔案。glob函式需帶入參數,在這裡要取得的是以「營收」結尾的所有Excel檔案,也就是檔名最後含有「營收」且副檔名中包括xls或xlsx的檔案。因此規則可以設定為「*營收.xls*」。

files_list = target_folder_path.glob('*營收.xlsx')

巡迴檔案路徑

接下來,我們一樣要透過for建構一個迴圈巡迴檔案路徑,把符合條件之檔名一個個的從指定為files_list變數的Path物件中取出。

# 巡迴檔案路徑
for file in files_list:
# .....

# 取出活頁簿的名稱

透過Path物件的屬性name取出符合條件之Excel活頁簿檔案的名稱,並且指派為變數old_file_name。

# 巡迴檔案路徑
for file in files_list:
# 取出活頁簿的名稱
old_file_name = file.name

# 在檔名中取代為新名稱

replace函式是字串物件的函式,函式包括兩個參數,第一個參數是函式要搜尋的字串,而第二個參數則是要拿來取代前面找到的內容。透過replace函式,可在字串中進行尋找條件,並且取代,因此可以將舊檔案名稱取代為新的名稱。

# 巡迴檔案路徑
for file in files_list:
# 取出活頁簿的名稱 ...
# 在檔名中取代為新名稱
new_file_name = old_file_name.replace('營收','營業額')

# 用新檔名建構新的檔案路徑

with_name是Path中的一個函式。可以將檔案路徑中的檔案名稱取代為新的檔案名稱,並且建立出新的檔案路徑。也就是以原來的路徑加上新的名稱所構成的新路徑。

# 巡迴檔案路徑
for file in files_list:
# 取出活頁簿的名稱...
# 在檔名中取代為新名稱...
# 用新檔名建構新的檔案路徑
new_file_path = file.with_name(new_file_name)

# 重新命名

透過rename函式,使用新的路徑執行重新命名的步驟。

# 巡迴檔案路徑
for file in files_list:
# 取出活頁簿的名稱...
# 在檔名中取代為新名稱...
# 用新檔名建構新的檔案路徑...
# 重新命名
file.rename(new_file_path)

以下是批次重新命名多個Excel活頁簿檔案的完整程式碼:

from pathlib import Path
# 列出要重新命名的檔案所在之資料夾路徑
target_folder_path = Path('重新命名的檔案所在的路徑')
# 取得資料夾下所有檔名主要為「營收」結尾的所有excel檔案路徑
files_list = target_folder_path.glob('*營收.xlsx')
# 巡迴檔案路徑
for file in files_list:
# 取出活頁簿的名稱
old_file_name = file.name
# 在檔名中取代為新名稱
new_file_name = old_file_name.replace('營收','營業額')
# 用新檔名建構新的檔案路徑
new_file_path = file.with_name(new_file_name)
# 重新命名
file.rename(new_file_path)

結語

Excel是大家辦公室常用的一種格式。不論您是否使用微軟的Microsoft Excel軟體,在工作上多多少少都還是會碰到存放在Excel格式的資料。因此,如果對於Excel的操作可以多加瞭解,必定對於工作上有所幫助。

另外,雖然本片的標題為批次重新命名Excel檔,但是實際上批次重新命名的檔案型態並不限於Excel檔,日後將撰文介紹其他檔案的批次命名。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。