寫這個腳本主要是給自己用的腿时,因為有時候在網(wǎng)上下載的資源每個文件前面都有一句廣告况脆,一個文件一個文件的重命名太慢,于是就寫了這個腳本批糟。Python的os模塊封裝了大量的系統(tǒng)命令格了,我們可以方便的調用。目前腳本有四個功能:
- 將文件名稱中指定的文字刪掉
- 添加指定的文字到文件名稱的前面
- 添加指定的文字到文件名稱的后面
- 重命名某個文件夾下的文件徽鼎,并按照指定的順序添加后綴(1)(2)(3)...
- 用新的文字替換特定的文字
對于以上的功能盛末,全部都需要文件夾的絕對路徑弹惦,文件的重命名也是建立在絕對路徑之上的,所以下面的函數(shù)返回的都是文件的絕對路徑悄但。
獲取文件夾下所有文件
最主要的函數(shù)是得到某個文件夾下的所有文件棠隐,并將所有文件的絕對路徑添加到list中。用戶輸入文件夾路徑后會詢問是否將文件夾也視為文件(如果“是”之后的操作也會對文件夾進行)檐嚣,主要代碼如下:
def get_all_files_path(dir_path):
all_files = []
ch = input("是否對文件夾進行操作[Y/N]:\n")
for file in listdir(dir_path):
file_path = os.path.join(dir_path, file)
if ch == "N" or ch == "n":
# if it is file,add it to the list
if os.path.isfile(file_path):
all_files.append(file_path)
elif ch == "Y" or ch == "y":
all_files.append(file_path)
return all_files
刪除助泽、添加和替換文字
對于文件名稱的刪除、添加或替換文字大同小異嚎京,這里以刪除為例:
- 首先獲取文件的名稱嗡贺,判斷待刪除的文字是否在其中;
- 然后獲得文件的絕對路徑(不包含文件名稱鞍帝,之后會將其與文件的新名稱結合到一起)诫睬;
- 獲取文件類型,并將其從文件名稱中去掉帕涌,比如"test.txt"去掉之后就變?yōu)榱?test"摄凡,這樣做是為了防止刪除的文字也包含在文件的類型名中;
- 將上一步得到的文件名刪除掉特定的文字得到的新文件名蚓曼;
- 將第2步得到的絕對路徑架谎、第3步得到的文件類型、第四步得到的文件名聯(lián)合到一起
- 調用
os.rename
函數(shù)
代碼如下:
# 當前文件名
file_name_now = os.path.basename(file_path)
# 不包含文件名的絕對路徑即目錄路徑
file_abspath_no_name = os.path.dirname(file_path)
# 保存文件類型
file_type = os.path.splitext(file_path)[1]
# 將文件類型從文件名中去掉
file_name_deleted_type = file_name_now.replace(file_type, "")
# 將絕對路徑辟躏、文件名、類型聯(lián)合
file_name_new_no_type = file_name_deleted_type.replace(str_to_del, "")
file_name_new = file_name_new_no_type + file_type
file_name_final = os.path.join(file_abspath_no_name, file_name_new)
os.rename(file_path, file_name_final)
這里主要說一下第3步和第5步用到的函數(shù)土全。os.path.splitext(path)
函數(shù)可以將文件路徑與文件類型分割捎琐,返回一個tuple,我們就可以用切片操作符([ ])來得到文件類型裹匙,例如os.path.splitext('E:/test.txt')
可以得到("E:/test",".txt")
瑞凑,還有一個類似的函數(shù)是os.path.split(path)
,返回的是包含文件的目錄路徑和文件名的tuple概页;和路徑有關的字符串聯(lián)合不能簡單的用+
籽御,需要用到os.path.join
函數(shù)。
重命名文件及添加后綴
重命名文件以及添加后綴實現(xiàn)都比較簡單惰匙,在獲得了文件的目錄路徑和新文件名后直接重命名即可技掏,添加后綴只要設立一個變量累加并將其添加到文件名中即可。主要值得一提的是按照特定的順序添加后綴项鬼,目前支持根據(jù)文件在資源瀏覽器中的順序哑梳、創(chuàng)建時間、最近修改時間和最近訪問時間來確定順序绘盟。
由于在get_all_files_path()
函數(shù)中我們已經(jīng)得到的一個list鸠真,所以我們直接對其排序即可悯仙,如果不排序則其順序就是文件在資源瀏覽器中的順序。
os.path.getctime(path) # 獲得文件創(chuàng)建時間
os.path.getmtime(path) # 獲得文件最近修改時間
os.path.getatime(path) # 獲得文件最近訪問時間
對于list的排序我們需要用到lambda表達式:
new_list = sorted(get_all_files_path(dir_path), key=lambda file_p: os.path.getctime(file_p))
其他
Python對系統(tǒng)命令的封裝使得用Python寫一個類似的腳本變得很簡單吠卷,當我打算用C/C++重寫時在獲得某個文件夾下的所有文件就遇到了困難......
在調用import
的模塊的函數(shù)時锡垄,解釋器會先搜索這個模塊中所有的函數(shù),這樣就會增加一定的時間開銷祭隔,所以在大量調用某個模塊中的一個函數(shù)時货岭,用from ... import ...
會更快些;