當(dāng)前支持在單個(gè)文件夾下重命名,并提前備份原文件杠巡,過(guò)濾子文件夾,對(duì)于原名和新名相同的文件雇寇,不作修改
代碼:
import os
import shutil
import datetime
def backup_files(src_path):
filenames = os.listdir(src_path)
for filename in filenames:
old_name = os.path.join(src_path, filename)
if os.path.isdir(old_name):
continue
shutil.copy(old_name, backup_path)
def batch_rename(src_path,date):
filenames = os.listdir(src_path)
same_name = []
count = 0
for filename in filenames:
old_name = os.path.join(src_path, filename)
if os.path.isdir(old_name):
continue
count += 1
change_name = date + '_%04d' % count + '.' + filename.split('.')[1]
new_name = os.path.join(src_path, change_name)
if change_name in filenames:
same_name.append(change_name)
continue
os.rename(old_name, new_name)
print('\n一共' + str(count) + '個(gè)文件,' + '修改了' + str(int(count) - len(same_name)) + '個(gè)文件的名字')
if len(same_name) > 0:
print('其中有' + str(len(same_name)) + '個(gè)文件的原名與新名相同,不作修改')
if __name__ == '__main__':
date = datetime.datetime.now().strftime('%m%d')
src_path = r'C:\Users\1\Desktop\2'
backup_path = src_path + '/' + 'backup/'
if not os.path.exists(backup_path):
os.makedirs(backup_path)
backup_files(src_path)
batch_rename(src_path,date)
筆記:
1.需要用到Python庫(kù)的os
氢拥,shutil
,datetime
2.定義backup_files()
函數(shù)用于在重命名之前備份原文件
3.os.listdir()
列出文件夾內(nèi)所有文件锨侯,包括子文件夾嫩海,由于并不需要重命名子文件夾,因此用下面代碼過(guò)濾掉子文件夾囚痴,os.path.isdir()
判斷是否為文件夾叁怪,如果是,則continue
跳過(guò)深滚,代碼如下:
if os.path.isdir(old_name):
continue
4.shutil.copy()
將原文件復(fù)制到另一個(gè)路徑下奕谭,傳入兩個(gè)參數(shù),第一個(gè)是需要復(fù)制的文件(包含路徑)痴荐,第二個(gè)是目標(biāo)文件夾路徑
5.定義batch_rename()
函數(shù)用于批量重命名
6.循環(huán)遍歷文件血柳,獲取舊的文件名old_name
,同樣需要過(guò)濾文件夾
7.設(shè)定新文件名的格式change_name
蹬昌,可隨意設(shè)置混驰,這里以“當(dāng)天日期+第n個(gè)文件+原后綴”為名,其中filename.split('.')[1]
將原文件名以.
為分隔符將名字和后綴分開(kāi),得到一個(gè)列表栖榨,取列表第1個(gè)元素昆汹,即后綴
8.為避免原名與新名重復(fù)而導(dǎo)致重命名后覆蓋原文件,用if
判斷語(yǔ)句跳過(guò)同名文件婴栽,并將同名的文件名添加到same_name
列表中满粗,代碼如下:
if change_name in filenames:
same_name.append(change_name)
continue
9.用os.rename()
方法對(duì)文件重命名,傳入兩個(gè)參數(shù)愚争,第一個(gè)原文件名(包含路徑)映皆,第二個(gè)新文件名(包含路徑)
10.用datetime
獲取當(dāng)前日期和時(shí)間,datetime.datetime.now()
獲取當(dāng)前時(shí)間轰枝,年月日+時(shí)分秒捅彻,strftime()
用于格式化時(shí)間,可指定獲取時(shí)間的格式鞍陨,例如只輸出年份步淹,或者只輸出月+日
#這里輸出當(dāng)天的月+日
date = datetime.datetime.now().strftime('%m%d')