Python批量實(shí)現(xiàn)文件查找、打包與修改名字
一、問(wèn)題的由來(lái)
剛開(kāi)學(xué),學(xué)校教務(wù)辦下達(dá)了進(jìn)行畢業(yè)論文抽查的通知。根據(jù)通知的要求,我們需要把指導(dǎo)學(xué)生的論文材料根據(jù)畢業(yè)檔案進(jìn)行整理,每個(gè)學(xué)生的畢業(yè)檔案內(nèi)容如下:

論文抽檢要求主要包括以下要求:
1.重命名論文原文pdf,命名方式與《XX學(xué)院論文信息匯總表》表X列一致
2.生成支撐材料zip文件,命名方式與《XX學(xué)院論文信息匯總表》表Y列一致。
壓縮包內(nèi)含:開(kāi)題報(bào)告(學(xué)生姓名+開(kāi)題報(bào)告,word格式)
中期檢查表(學(xué)生姓名+中期檢查表,word)翻譯原文(僅翻譯專業(yè),學(xué)生姓名+翻譯原文,pdf)
3.重命名查重報(bào)告 pdf,命名方式與《XX學(xué)院論文信息匯總表》表Z列一致
以前準(zhǔn)備這些資料時(shí),我都是先打開(kāi)匯總表,復(fù)制文件名,然后去更改學(xué)生的畢業(yè)論文資料信息,如果只是三四個(gè)人還好說(shuō),可是今年我指導(dǎo)了10個(gè)人的論文,每個(gè)學(xué)生我要復(fù)制三個(gè)文件名,一個(gè)個(gè)去改,還要找到壓縮包中要求的支撐材料,打包成指定文件名的zip包,一個(gè)學(xué)生平均花費(fèi)我3分鐘時(shí)間,10個(gè)人就是30分鐘,真的是耗時(shí)費(fèi)力,而且極易出錯(cuò)。怎么能夠快速、準(zhǔn)確地完成這項(xiàng)任務(wù)呢?
二、問(wèn)題的解決
考慮到這個(gè)操作過(guò)程主要是讀取文件夾、查找文件名、重命名文件、壓縮成指定文件名這些操作,而且還是一個(gè)重復(fù)的過(guò)程,并且有規(guī)律可循。我又審查了我要處理的文件,雖然文件名中有空格或者+號(hào),同一類(lèi)文件如論文pdf文件,都有”論文“這個(gè)關(guān)鍵詞,因此可以通過(guò)查找關(guān)鍵詞來(lái)鎖定文件名,然后進(jìn)行改名等操作。
首先,我先把我指導(dǎo)學(xué)生的信息從學(xué)院匯總表中復(fù)制出來(lái),清除里的格式,單獨(dú)存放為data.xlsx, 如下圖所示。這樣做的目的是讓Python更好地從本地讀取數(shù)據(jù)信息。

data.xlsx
然后,我把準(zhǔn)備好的畢業(yè)生的檔案信息壓縮包解壓,這樣可以看到每一個(gè)文件夾下面都放有一個(gè)畢業(yè)生所有的畢業(yè)論文信息,每些文件夾中都包含有學(xué)生的姓名,我們就通過(guò)關(guān)鍵詞姓名來(lái)讓程序找到目的文件夾。

接著,我打開(kāi)AI,描述我們要操作的過(guò)程,由于起初我并不知道要打包那三個(gè)文件,所以我在提示詞中是要求建一個(gè)空的zip,我通過(guò)拖動(dòng)的方法把指定的文件拖進(jìn)壓縮包。所以,我的提示詞是這樣的,為了準(zhǔn)確讀取數(shù)據(jù),我還把Excel數(shù)據(jù)表貼了上去,這樣便于AI準(zhǔn)確編寫(xiě)數(shù)據(jù)讀取代碼。:

AI輔助編寫(xiě)代碼
AI很快就給出了我想要的代碼,而且對(duì)每一行代碼都進(jìn)行了清晰地注釋,并能實(shí)現(xiàn)以下功能:
1. 讀取 Excel 表格中的內(nèi)容;
2. 獲取每位學(xué)生的 姓名、論文名、支撐材料名、查重報(bào)告名;
3.在當(dāng)前目錄下找到以學(xué)生姓名命名的文件夾;
4.學(xué)生論文文件夾中:新建一個(gè)空的 zip 文件,命名為支撐材料名;
5. 查找包含 “論文”和“終稿” 的 pdf,重命名為論文名;
6. 查找包含 “查重報(bào)告” 的 pdf,重命名為查重報(bào)告名。
最終代碼如下:
import os
import pandas as pd
import zipfile
import shutil
# Excel 文件路徑
excel_file = "students.xlsx" # 替換成你的實(shí)際 Excel 文件名
# 讀取 Excel
df = pd.read_excel(excel_file)
# 當(dāng)前工作目錄
base_dir = os.getcwd()
for _, row in df.iterrows():
name = row["姓名"]
thesis_name = row["論文"]
support_zip = row["支撐材料文件名稱"]
report_name = row["查重報(bào)告"]
# 找到學(xué)生文件夾
student_dir = os.path.join(base_dir, name)
if not os.path.exists(student_dir):
print(f"未找到 {name} 的文件夾,跳過(guò)。")
continue
# 進(jìn)入學(xué)生文件夾
os.chdir(student_dir)
# 1. 新建空 zip 文件
if not os.path.exists(support_zip):
with zipfile.ZipFile(support_zip, "w") as zf:
pass
print(f"已創(chuàng)建 {support_zip}")
# 2. 遍歷文件,重命名論文和查重報(bào)告
for file in os.listdir(student_dir):
lower_file = file.lower()
# 找論文文件:包含 "論文" 和 "終稿"
if file.endswith(".pdf") and ("論文" in file or "終稿" in file):
new_path = os.path.join(student_dir, thesis_name)
shutil.move(file, new_path)
print(f"{file} 已重命名為 {thesis_name}")
# 找查重報(bào)告文件
elif file.endswith(".pdf") and "查重報(bào)告" in file:
new_path = os.path.join(student_dir, report_name)
shutil.move(file, new_path)
print(f"{file} 已重命名為 {report_name}")
# 回到上級(jí)目錄
os.chdir(base_dir)
print("處理完成!")以上代碼在測(cè)試中,我發(fā)現(xiàn)程序找不到【論文】這個(gè)key,經(jīng)過(guò)研判原來(lái)是data.xlsx數(shù)據(jù)表中表頭中有論文名稱列,而沒(méi)有論文列,造成文件中數(shù)據(jù)與代碼不匹配,所以就報(bào)錯(cuò)了。我把數(shù)據(jù)表中論文名稱列改名為論文,然后運(yùn)行代碼成功。但也發(fā)現(xiàn)了幾個(gè)小問(wèn)題:
1. 當(dāng)前代碼只能遍歷當(dāng)前包含指定人名的目錄,如果里面還有子目錄就無(wú)法遍歷,需要把os.listdir()改為os.walk(),這樣就能找到子目錄里的文件了。
2. 沒(méi)有對(duì)包含有指定關(guān)鍵詞的三個(gè)PDF文件進(jìn)行打包重命名,只是生成了一個(gè)空壓縮包文件。
3. 學(xué)生檔案中有兩個(gè)查重報(bào)告,其中有一個(gè)是AIGC的查重報(bào)告,所以改名時(shí)還要排除掉AIGC這個(gè)關(guān)鍵詞。
4. 源代碼中數(shù)據(jù)表名是students.xlsx,改為正確的data.xlsx后,程序就可以成功讀取了。
三、代碼的優(yōu)化
針對(duì)以上問(wèn)題,我們對(duì)代碼進(jìn)行了優(yōu)化,主要解決以下三個(gè)問(wèn)題:
1. 利用os.walk()遍歷子目錄,代碼如下:
for root, dirs, _ in os.walk(base_dir):
for folder in dirs:
if name in folder:
student_dir = os.path.join(root, folder)
break
if student_dir:
break2. 確定打包文件名中包含:"開(kāi)題報(bào)告", "中期", "原文"這三個(gè)關(guān)鍵詞,并且不需要改名。因此可以首先建立一個(gè)壓縮包,再遍歷子目錄找到包含三個(gè)關(guān)鍵詞的不同文件,將它們寫(xiě)入到指定文件名的zip文件中。代碼如下所示
# 關(guān)鍵詞列表,用于支撐材料打包
keywords = ["開(kāi)題報(bào)告", "中期", "原文"]
# 創(chuàng)建/覆蓋 zip 文件
zip_path = os.path.join(student_dir, support_zip)
with zipfile.ZipFile(zip_path, "w") as zipf:
# 遍歷學(xué)生文件夾及子文件夾
for root, _, files in os.walk(student_dir):
for file in files:
if any(keyword in file for keyword in keywords):
file_path = os.path.join(root, file)
# 添加到 zip,保留相對(duì)路徑
arcname = os.path.relpath(file_path, student_dir)
zipf.write(file_path, arcname)
print(f"{file} 已加入 {support_zip}")
3. 排除包含AIGC關(guān)鍵詞的查重報(bào)告,可以通過(guò)if判斷來(lái)實(shí)現(xiàn)。
# 3. 重命名查重報(bào)告文件(排除 AIGC)
for root, _, files in os.walk(student_dir):
for file in files:
if file.endswith(".pdf") and "查重報(bào)告" in file and "AIGC" not in file:
file_path = os.path.join(root, file)
new_path = os.path.join(student_dir, report_name)
shutil.move(file_path, new_path)
print(f"{file} 已重命名為 {report_name}")四、代碼展示
最終,我們借助AI,自定義了一個(gè)60余行Python代碼實(shí)現(xiàn)了畢業(yè)論文的全自動(dòng)歸檔,把30分鐘的工作任務(wù)壓縮到3秒鐘來(lái)完成,工作效率和準(zhǔn)確度成倍提升。最終代碼如下:
import os
import pandas as pd
import zipfile
import shutil
# Excel 文件路徑
excel_file = "data.xlsx" # 替換成你的實(shí)際 Excel 文件名
# 讀取 Excel
df = pd.read_excel(excel_file)
# 當(dāng)前工作目錄
base_dir = os.getcwd()
# 關(guān)鍵詞列表,用于支撐材料打包
keywords = ["開(kāi)題報(bào)告", "中期", "原文"]
for _, row in df.iterrows():
name = row["姓名"]
thesis_name = row["論文"]
support_zip = row["支撐材料文件名稱"]
report_name = row["查重報(bào)告"]
# 查找包含學(xué)生姓名的文件夾(遞歸)
student_dir = None
for root, dirs, _ in os.walk(base_dir):
for folder in dirs:
if name in folder:
student_dir = os.path.join(root, folder)
break
if student_dir:
break
if not student_dir:
print(f"未找到包含 {name} 的文件夾,跳過(guò)。")
continue
# 1. 打包支撐材料文件
zip_path = os.path.join(student_dir, support_zip)
with zipfile.ZipFile(zip_path, "w") as zipf:
for root, _, files in os.walk(student_dir):
for file in files:
if any(keyword in file for keyword in keywords):
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, student_dir) # 保留相對(duì)路徑
zipf.write(file_path, arcname)
print(f"{file} 已加入 {support_zip}")
print(f"{support_zip} 已生成/覆蓋完成。")
# 2. 重命名論文文件
for root, _, files in os.walk(student_dir):
for file in files:
if file.endswith(".pdf") and ("論文" in file or "終稿" in file):
file_path = os.path.join(root, file)
new_path = os.path.join(student_dir, thesis_name)
shutil.move(file_path, new_path)
print(f"{file} 已重命名為 {thesis_name}")
# 3. 重命名查重報(bào)告文件(排除 AIGC)
for root, _, files in os.walk(student_dir):
for file in files:
if file.endswith(".pdf") and "查重報(bào)告" in file and "AIGC" not in file:
file_path = os.path.join(root, file)
new_path = os.path.join(student_dir, report_name)
shutil.move(file_path, new_path)
print(f"{file} 已重命名為 {report_name}")
print("全部學(xué)生處理完成!")
五、結(jié)語(yǔ)
1. 對(duì)于一些批量的、有規(guī)律的文件操作包括:查找、改名、移動(dòng)、刪除、創(chuàng)建、打包等操作均可以使用Python來(lái)替代人工來(lái)解決。解決問(wèn)題的關(guān)鍵是準(zhǔn)確向人工智能工具描述你要做的工作,預(yù)期要達(dá)到什么目標(biāo),涉及的文件名、路徑等信息都要明確給出,提升代碼的準(zhǔn)確率和適用性。
2. 即使是你再準(zhǔn)確描述,可能由于實(shí)際情況的復(fù)雜性,運(yùn)行代碼時(shí)也難免出錯(cuò),或者出現(xiàn)執(zhí)行不到位、不全面的情況,此時(shí)要認(rèn)真查看報(bào)錯(cuò)信息,明確出錯(cuò)的代碼位置,通過(guò)人工智能輔助排查、個(gè)人獨(dú)立判斷來(lái)解決。
3.AI 的輔助代碼生成功能更強(qiáng),它會(huì)把執(zhí)行步驟清楚地注釋出來(lái) ,結(jié)構(gòu)化的編程過(guò)程大大提升了編程者的邏輯思維和解決問(wèn)題的能力,我們可以學(xué)習(xí)它代碼編寫(xiě)的邏輯為我們獨(dú)立完成任務(wù)積累寶貴的經(jīng)驗(yàn)。

到此這篇關(guān)于Python批量實(shí)現(xiàn)文件查找、打包與修改名字的文章就介紹到這了,更多相關(guān)Python文件批量處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3中for循環(huán)踩過(guò)的坑記錄
這篇文章主要給大家介紹了python3中for循環(huán)踩坑的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
python3在同一行內(nèi)輸入n個(gè)數(shù)并用列表保存的例子
今天小編就為大家分享一篇python3在同一行內(nèi)輸入n個(gè)數(shù)并用列表保存的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
python命令行參數(shù)解析OptionParser類(lèi)用法實(shí)例
這篇文章主要介紹了python命令行參數(shù)解析OptionParser類(lèi)用法實(shí)例,需要的朋友可以參考下2014-10-10
用gpu訓(xùn)練好的神經(jīng)網(wǎng)絡(luò),用tensorflow-cpu跑出錯(cuò)的原因及解決方案
這篇文章主要介紹了用gpu訓(xùn)練好的神經(jīng)網(wǎng)絡(luò),用tensorflow-cpu跑出錯(cuò)的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
基于python traceback實(shí)現(xiàn)異常的獲取與處理
這篇文章主要介紹了基于python traceback實(shí)現(xiàn)異常的獲取與處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
python3列表刪除大量重復(fù)元素remove()方法的問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于python3列表刪除大量重復(fù)元素remove()方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
幾行代碼讓 Python 函數(shù)執(zhí)行快 30 倍
Python 編程語(yǔ)言,與其他流行編程語(yǔ)言相比主要缺點(diǎn)是它的動(dòng)態(tài)特性和多功能屬性拖慢了速度表現(xiàn)。Python 代碼是在運(yùn)行時(shí)被解釋的,而不是在編譯時(shí)被編譯為原生代碼。在本文中,我們將討論如何用多處理模塊并行執(zhí)行自定義 Python 函數(shù),并進(jìn)一步對(duì)比運(yùn)行時(shí)間指標(biāo)。2021-10-10
Python Pytorch深度學(xué)習(xí)之Tensors張量
今天小編就為大家分享一篇Pytorch之Tensors張量的文章,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-10-10

