Python多进程批量重命名文件:解决序号不连续问题
本文介绍使用Python多进程技术批量重命名文件的方案,旨在修复因文件删除导致的序号不连续问题。通过遍历指定目录获取文件列表,利用正则表达式提取并重新计算序号,结合进程池并发执行os.rename操作,显著提升40万级文件处理效率。
本文详细介绍了一种基于Python多进程技术的批量文件重命名方法,供读者参考实践。
背景说明
文件命名遵循数字序号前缀格式,但由于部分文件被删除,导致序号出现断层和不连续。为了保持序号的连续性,需要对大量文件(总计超过40万个)进行重命名处理,因此采用多进程策略以提升执行效率。
核心代码实现
import os
import re
from multiprocessing import Pool
def getAllFilePath(pathFolder,filter=[".jpg",".txt"]):
#遍历文件夹下所有图片
result=[]
#maindir是当前搜索的目录 subdir是当前目录下的文件夹名 file是目录下文件名
for maindir,subdir,file_name_list in os.walk(pathFolder):
for filename in file_name_list:
apath=os.path.join(maindir,filename)
ext=os.path.splitext(apath)[1]#返回扩展名
if ext in filter:
result.append(apath)
return result
def changName(filePath,changeNum):
fileName=os.path.basename(filePath)
dirName=os.path.dirname(filePath)
pattern = re.compile(r'\d+')
if len(pattern.findall(filePath))!=0:
numInFileName=str(int(pattern.findall(fileName)[0])-changeNum)
newFileName=pattern.sub(numInFileName,fileName)
os.rename(filePath,os.path.join(dirName,newFileName))
print('{1} is changed as {0}'.format(newFileName,fileName))
def changeNameByList(fileList,changNum):
print('fileList len is:{}'.format(len(fileList)))
for fileName in fileList:
changName(fileName,changNum)
print(fileName,' is done!')
if __name__ =='__main__':
allFilePath=getAllFilePath(r'E:\Numberdata\4')
n_total=len(allFilePath)
n_process=8 #8线程
#每段子列表长度
length=float(n_total)/float(n_process)
indices=[int(round(i*length)) for i in range(n_process+1)]
sublists=[allFilePath[indices[i]:indices[i+1]] for i in range(n_process)]
#生成进程池
p=Pool(n_process)
for i in sublists:
print("sublist len is {}".format(len(i)))
p.apply_async(changeNameByList, args=(i,161130))
p.close()
p.join()
关键注意事项
- 在使用多进程配合VSCode终端进行调试时,可能不会直接抛出错误信息,需留意潜在的并发Bug。
- 使用os.rename()函数时,若目标文件名已存在,程序将抛出异常报错,需确保目标名称唯一。
更多关于Python相关技术内容,推荐参考本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》。
希望上述内容能对您的Python编程工作提供有益帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













