Python根據(jù)Excel表進(jìn)行文件重命名的實(shí)現(xiàn)示例
一、問題背景
在日常辦公過程中,批量重命名是經(jīng)常使用的操作。之前我們已經(jīng)進(jìn)行了初步探索,主要是通過批處理文件、renamer軟件或者Python中的pathlib等模塊對當(dāng)前目錄下的文件進(jìn)行批量重命名。
而今天我們要使用的是Python+Excel的方法對指定目錄下的文件進(jìn)行個(gè)性化的重命名。采用這種方法有以下兩種優(yōu)勢:
1. 個(gè)性化重命名
原文件名和目標(biāo)文件名沒有規(guī)律,無法通過正則表達(dá)式進(jìn)行重命名,可以用Excel對文件名進(jìn)行手動編輯,對指定文件進(jìn)行個(gè)性化的重命名。
2. 支持逆向重命名
以往批量重命名前,需要對原文件名進(jìn)行備份,否則重命名后還需要手動改回來,十分麻煩。而這種方法只需要交換A列和B列的數(shù)據(jù),就可以進(jìn)行逆向重命名,不必?fù)?dān)心改完后不能恢復(fù)原文件名。
二、批量重命名實(shí)現(xiàn)過程
1.問題的提出
當(dāng)前目錄下有AAA.txt,BBB.txt, CCC.txt等多個(gè)文件,我們需要把它們批量重命名為111.txt, 222.txt, 333.txt這樣的形式,一般的批量重命名的方法很難實(shí)現(xiàn)。
問題的提出
2. 問題分析
我們把需要重命名的文件選中,在【主頁】標(biāo)簽下點(diǎn)擊【復(fù)制路徑】獲取這些文件名的路徑。
獲取文件路徑
然后我們就可以得到下面這種樣式:
"G:\桌面\用Python給文件進(jìn)行批量重命名\AAA.txt" "G:\桌面\用Python給文件進(jìn)行批量重命名\BBB.txt" "G:\桌面\用Python給文件進(jìn)行批量重命名\CCC.txt"
把上面的內(nèi)容復(fù)制到Excel中,按"\"和引號進(jìn)行【分列】操作,最后得到【111.txt, 222.txt, 333.txt】這樣的文件名,然后放到A列中,如下圖所示:
批量重命名Excel文件
Excel表中,A列為舊的文件名, B列為新的文件名,我們可以手動對新文件名進(jìn)行修改,然后通過Python讀取txg每一行,把A列文件名重命名為B列對應(yīng)的文件名。
3. 問題的解決
下一步,我們就可以采用Python編寫對應(yīng)代碼:讀取Excel文件中的A列和B列內(nèi)容,然后遍歷當(dāng)前目錄下的指定文件,采用os.rename()對文件進(jìn)行重命名。
第一種方法:使用xlwings——過程有點(diǎn)兒復(fù)雜
原理就是讀取file_name.xlsx文件中的內(nèi)容,然后遍歷每一行后,用os.rename()進(jìn)行重命名。
import os import xlwings as xw name_path = r'file_name.xlsx' # 打開工作簿 app = xw.App(visible=False, add_book=False) app.display_alerts = False # 關(guān)閉一些提示信息,可以加快運(yùn)行速度。 默認(rèn)為 True app.screen_updating = False # 更新顯示工作表的內(nèi)容。默認(rèn)為 True。關(guān)閉它也可以提升運(yùn)行速度 wb = app.books.open(name_path) # 獲取數(shù)據(jù)源表格 sht = wb.sheets['name'] col_data_old = sht.range('A2:A200').value # 舊文件名,A列 col_data_new = sht.range('B2:B200').value # 新文件名,B列 # 重命名 for i in range(len(col_data_new)): if col_data_old[i] is not None and col_data_new[i] is not None: # 如果單元格值不是 None,則處理這些值 file_name = os.path.abspath(col_data_old[i]) file_rename = os.path.abspath(col_data_new[i]) os.rename(file_rename, file_name) # 保存表格并退出 wb.save() wb.close() app.quit()
第二種方法:采用openpyxl——簡化代碼
相比xlwings,openpyxl的代碼更為簡單,邏輯也很清晰。導(dǎo)入模塊,打開工作簿,獲取表格的內(nèi)容,循環(huán)每一行,讀取非空數(shù)據(jù),然后用os.rename()進(jìn)行重命名。
import os import openpyxl name_path = r'file_name.xlsx' # 打開工作簿 wb = openpyxl.load_workbook(name_path) # 獲取數(shù)據(jù)源表格 sht = wb.worksheets[0] # 獲取 A 列和 B 列的最大行數(shù) max_row = max(sht.max_row, sht.max_column) # 遍歷 A 列和 B 列,將非空數(shù)據(jù)添加到字典中 for row in range(2, max_row + 1): key = sht.cell(row=row, column=1).value value = sht.cell(row=row, column=2).value if key is not None and value is not None: file_name = os.path.abspath(key) file_rename = os.path.abspath(value) os.rename(file_name, file_rename)
第三種方法:Pandas法——進(jìn)一步簡化
pandas這個(gè)模塊導(dǎo)入雖然有點(diǎn)兒慢,但是它的重命名代碼量最少,搭配上pathlib,命名效率更高。實(shí)現(xiàn)過程是導(dǎo)入pandas和path模塊,讀取Excel文件,把A列和B列轉(zhuǎn)化為一一對應(yīng)的字典,然后遍歷Excel表的每一行進(jìn)行批量重命名。
from pathlib import Path import pandas as pd # 文件路徑 name_path = Path('file_name.xlsx') # 讀取 Excel 文件 df = pd.read_excel(name_path) # 將 A 列和 B 列數(shù)據(jù)轉(zhuǎn)換為字典 data_dict = df.set_index(df.columns[0]).squeeze().to_dict() # 遍歷字典,執(zhí)行文件重命名 for key, value in data_dict.items(): if pd.notna(key) and pd.notna(value): file_name = Path(key).absolute() # 獲取原文件的絕對路徑 file_rename = Path(value).absolute() file_name.rename(file_rename)
以上代碼中,首先將 Excel 文件讀取到 df 這個(gè)數(shù)據(jù)框變量中,然后使用 set_index() 方法將第一列設(shè)置為索引,并使用 squeeze() 方法將結(jié)果轉(zhuǎn)換為 Series。然后,使用 to_dict() 方法將 Series 轉(zhuǎn)換為字典。最后,遍歷字典,執(zhí)行文件重命名操作。
三、學(xué)后反思
- Python在批量重命名的過程中體現(xiàn)出良好的跨平臺性,可以把Excel表和文件連接起來,使數(shù)據(jù)的流轉(zhuǎn)更加便捷。另一方面,Python在批量操作文件方面的優(yōu)勢明顯,程序調(diào)試成功后,哪怕是上千個(gè)文件也可以輕松重命名,可以極大地提升重命名準(zhǔn)確性和效率。
- 雖然我們可以通過交換A列和B列的數(shù)據(jù)進(jìn)行逆向重命名,但是保險(xiǎn)起見,還是在重命名之前對文件進(jìn)行備份,然后再操作,以免出現(xiàn)操作失誤的問題。
- Python程序默認(rèn)是從Excel表第二行開始讀取,所以一定要保留列索引,不要?jiǎng)h除,否則可能會出現(xiàn)報(bào)錯(cuò)。
- 本次小項(xiàng)目涉及xlwings, openpyxl和pandas等Excel讀取模塊,以及os和pathlib等多個(gè)文件管理模塊,對于讀取它們之間的差異具有很好的幫助作用??梢悦黠@看出,openpyxl和pandas比xlwings使用起來更簡單,所以推薦初學(xué)者直接學(xué)openpyxl,高級的學(xué)習(xí)者可以學(xué)習(xí)pandas,為后期學(xué)習(xí)數(shù)據(jù)分析打下基礎(chǔ)。
到此這篇關(guān)于Python根據(jù)Excel表進(jìn)行文件重命名的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python Excel文件重命名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)B站UP主小助手詳解開發(fā)流程
功能是不是還挺豐富的,從寫第一行代碼到完成也就花了兩天不到的時(shí)間,這也證明了使用python開發(fā)的高效率,下面來說說這些功能開發(fā)中我遇到了哪些問題,我又是如何解決的2022-02-02python實(shí)現(xiàn)簡單名片管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡單名片管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11python實(shí)現(xiàn)web應(yīng)用框架之增加響應(yīng)對象
這篇文章主要介紹了python利用web應(yīng)用框架如何增加響應(yīng)對象的,文中有相應(yīng)的代碼示例,對大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的同學(xué)可以參考下2023-05-05你知道嗎實(shí)現(xiàn)炫酷可視化只要1行python代碼
這篇文章主要給大家介紹了關(guān)于利用Python進(jìn)行數(shù)據(jù)可視化常見的9種方法!文中介紹的方法真的超實(shí)用!對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08python+mysql實(shí)現(xiàn)學(xué)生信息查詢系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+mysql實(shí)現(xiàn)學(xué)生信息查詢系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02