不到100行代码实现对文件夹内所有文件重命名,支持文件夹多层嵌套(理论支持无穷嵌套,只要你的计算机内存够大)。
两种重命名模式:
- 实现所有文件名都用随机20位字母数字代替;
- 在原有文件名前加上前缀。
注意:
- windows环境中Python自动获取的路径
os.getcwd()
很诡异,尽量自己手动输入路径; - 利用了递归实现了文件夹嵌套,请注意,递归的过程中是占用内存的,理论上支持文件夹的无穷嵌套,但也仅仅是理论上;
- 运行环境为Python 3.7.2 64-bit windows平台,若在Linux平台运行该代码,要考虑文件夹分隔符的改变。
# 导入系统模块
import os # 用于文件处理
import random # 用于生成随机文件名
from pathlib import Path # 用于获取本文件名
def getAllFiles(filePath=os.getcwd()):
'''
递归获取文件夹内所有文件
filePath:文件夹路径
'''
# 获取的当前文件夹路径不是当前文件所在的文件夹路径,而是Python程序运行时CMD窗口所运行的文件夹!
fileList = os.listdir(filePath)
# 判断路径为文件还是文件夹
for file in fileList:
tempPath = filePath+'\\'+file
if os.path.isdir(tempPath):
# 不是文件,进行递归操作
getAllFiles(tempPath)
elif os.path.isfile(tempPath):
# 是文件
if file != Path(__file__).name:
# 跳过对当前正在执行的py文件重命名
fileRename(tempPath)
else:
# 特殊无后缀文件
print("it's a special file(socket,FIFO,device file):"+tempPath)
def fileRename(filePath, myStr=''):
'''
对文件进行重命名
filePath 为文件路径(绝对路径)
myStr 为模式选择:
mode = ''时:去除原来的文件名,随机生成一个由大写字母、小写字母和数字组成的20位字符串作为文件名
例如:TNcxBZEvgZiH9OtqFMWC.jpg、fh4vUsewZ9y8RGBmLKg5.docx
mode != ''时:在原文件名前追加一个字符串(举例输入为:myStr)
例如:原文件名为 test.pptx,新文件名为 myStr_test.pptx
'''
splitSign = filePath.rfind('\\') # 获取文件名与路径分隔符位置
filePathShort = filePath[:splitSign] # 获取文件所在路径
fileSuffix = filePath[filePath.rfind(".")+1:] # 获取文件后缀
if not myStr:
# 随机重命名模式
randomStr = ''.join(random.sample(
'zyxwvutsrqponmlkjihgfedcbaABCDEFGHIJKLMNOPQRSTUZWXYZ0123456789', 20)) # 生成一个随机字符串(20位)
os.rename(filePath, filePathShort+'\\' +
randomStr+'.'+fileSuffix) # 重命名操作
else:
# 自定义模式
fileName = filePath[splitSign+1:filePath.rfind(".")] # 获取文件原名称
os.rename(filePath, filePathShort+'\\'+myStr + '_' +
fileName+'.'+fileSuffix) # 重命名操作
# 每重命名一个文件,计数器加1
global fileNum
fileNum += 1
def printInfo():
''' 打印程序提示 '''
print('='*40)
print(' 欢迎使用本程序 '.center(33, '+'))
print('='*40)
print("使用须知:")
print("1. 本程序基于Python 3.7.2 64-bit windows平台;")
print("2. 输入文件路径中必须以'\\'为分隔符。")
print('='*40)
# 打印提示信息
printInfo()
# 获取用户输入路径,若为当前路径直接回车
inputFilePath = input("请输入文件夹路径:")
# 定义一个变量用来记录重命名文件数量
fileNum = 0
# 执行程序
if inputFilePath:
# 用户输入了路径
getAllFiles(inputFilePath)
else:
# 用户输入为空,获取默认路径
getAllFiles()
inputFilePath = os.getcwd()
# 程序结束,打印结束信息
print(" 程序结束 ".center(36, '='))
print(f" 共对 {fileNum} 个文件完成操作 ".center(31, '='))
print(f"操作文件夹为:{inputFilePath}")
print('='*40)