基于Python的文件批量重命名(附详细过程解读)
基于Python的文件批量重命名(附詳細過程解讀)
0.閑言碎語
hi ~
歡迎關注公眾號“壹貳叁言”!
啥都寫,圖一樂哈哈!
1.前因后果
前幾日,我在用arcgis處理一些數據后,發現文件的命名不對,需要對文件進行重命名處理,
重命名第一個時
“啊,就這?”
處理第三個時
“嗯,還行”
處理完第一個文件夾時
“我********”
這時候,我腦海里突然想起了在遠方隔離的龍哥,有次聊天他問我
“Python是不是可以做比如文件批量重命名這種”
我的回答是
“Python會,我不會”
現在,
“能搞”
2.需求
我現在有一份數據,經過arcgis處理后,一共分為了13個文件夾,每個文件夾都包含了6個不同的文件,這6個文件又分別包含了7種不同格式的數據,數據格式是dbf、prj、sbn、sbx、shp、shx、xml。可見圖2.1和圖2.2
圖2.1中的文件夾的名字是化學元素的名字,圖2.2中的文件名字是6個村的名字,現在我想要的將各個村的名字格式統一,每個村的名字后面加上所屬元素如:A村_B,A村_Ca…同時,7種數據格式文件我只需要dbf、prj、shp、shx四種,其余的三種我希望可以被刪除。
成功的格式如圖2.3
圖 2.33.Python代碼
編碼格式如不規范歡迎大佬指正
import os import sys# 定義一個名字叫做rename的函數 def rename(filePath):"""批量重命名指定路徑下的'.dbf', '.prj', '.shp', '.shx'格式的文件,重命名格式:文件_文件夾名字,并刪除'.sbn', '.sbx', '.xml'格式的文件:param filePath: 文件夾的路徑:return: """# 文件篩選條件condition1 = ('.dbf', '.prj', '.shp', '.shx')condition2 = ('.sbn', '.sbx', '.xml')# os.walk 查找文件for root, dirs, files in os.walk(filePath):# 文件夾名字mark = root.split('\\')[-1]# for循環遍歷文件名字for fileName in files:if fileName != sys.argv[0]:if fileName.endswith(condition1):os.rename(os.path.join(root, fileName), os.path.join(root, fileName.split('.')[0] + '_' +mark + '.' + fileName.split('.')[-1]))print(fileName, '已經重命名成功了,乖乖,新名字是:', fileName.split('.')[0] + '_' + mark + '.'+ fileName.split('.')[-1])if fileName.endswith(condition2):delFileName = os.path.join(root, fileName)os.remove(delFileName)print(delFileName, '已經成功被移除。')if __name__ == '__main__':filePath = r'G:\村級裁剪'rename(filePath)4.代碼詳解
本次所使用到的Python包主要是OS,是Python自帶的包
第1、2行代碼主要是引入OS包和sys包
import os import sys在本次中寫了一個函數,函數主體包含了第5-32行代碼,其功能是
批量重命名指定路徑下的'.dbf', '.prj', '.shp', '.shx'格式的文件,重命名格式:文件_文件夾名字, 并刪除'.sbn', '.sbx', '.xml'格式的文件condiition1和condition2是我命名的兩個條件,將7個格式分為了我想要的兩類,
# 文件篩選條件 condition1 = ('.dbf', '.prj', '.shp', '.shx') condition2 = ('.sbn', '.sbx', '.xml')兩個condition的類型是元組,用元組的原因是我在后面使用了endswith函數,對應于第24行代碼,endswith的功能是判斷是否以某個指定后綴結尾,而我希望可以判斷多個指定后綴,其支持使用元組,如果想使用列表,可以使用關鍵詞any,如
if any(fileName.endswith(condition) for condition in conditions)需要清楚的是此時的conditions應是一個列表,如[’.dbf’, ‘.prj’, ‘.shp’, ‘.shx’]
第17行使用了函數os.walk()
for root, dirs, files in os.walk(path):root 表示正在訪問的當前目錄
dirs 表示root當前目錄下包含的子目錄
files 表示root當前目錄下包含的文件
第19行是取文件夾的名字,
mark = root.split('\\')[-1]因為取到的root是一個路徑,格式如下:
G:\村級裁剪\B
我目前能想到的取文件夾名字的方法是利用split函數,按照“\”進行分割(之所以用’\’是因為轉義字符),這樣取分割后的最后一個元素就是文件夾名字了,如果有大佬知道別的方法請指導學習一下。
第22行是一個for循環,遍歷文件的名字,第22和23都是if判斷語句,endswith作用可參考上面提到的,第25行是最重要的語句os.rename(src, dst)。
os.rename是用于命名文件或者目錄,其中src是要修改的文件名,dst是修改后的文件名
os.path.join()作用是把文件路徑和文件名組合在一起,這樣os.rename()才能找到文件的位置
# for循環遍歷文件名字 for fileName in files:if fileName != sys.argv[0]:if fileName.endswith(condition1):os.rename(os.path.join(root, fileName), os.path.join(root, fileName.split('.')[0] + '_' +mark + '.' + fileName.split('.')[-1]))print(fileName, '已經重命名成功了,乖乖,新名字是:', fileName.split('.')[0] + '_' + mark + '.'+ fileName.split('.')[-1])需要注意的是文件的新名字是我用字符串拼接成的。
第29行-32行是判斷文件是否滿足第二個條件,如果滿足則將其移除,最重要的語句是os.remove()
if fileName.endswith(condition2):delFileName = os.path.join(root, fileName)os.remove(delFileName)print(delFileName, '已經成功被移除。')第35行-37行是一個主函數,其中filePath是存放文件的路徑,rename()即是調用我寫好上面的rename函數。
運行后的頁面如圖4.1所示,
圖4.1整體其實不到一秒,這樣就可以大大增加摸魚的時間了
總結
以上是生活随笔為你收集整理的基于Python的文件批量重命名(附详细过程解读)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lazada卖家批量上货工具 全新问世的
- 下一篇: 中国电信天翼光猫改桥接模式