经常遇到这种情况,需要批量处理文件夹内的文件,并且处理后的也要按原本的相对路径存放,如下图:
大概原理就是遍历一编最高级的文件夹,获取每个文件的路径(这里指与程序的相对路径),然后把原本最高级文件夹的名称替换为要保存的最高文件夹的名称,于此同时把原最高级文件夹下的子文件夹复制过去,防止保存文件时,找不到路径报错,如下:
.\第一级文件夹\第二级文件夹1\第二级文件夹1的文件.txt
↓
.\新_第一级文件夹\第二级文件夹1\第二级文件夹1的文件.txt
有了原文件和新生成文件的路径,创建和读取文件就很方便了。
代码如下:
import re
import os
class TF:
def __init__(self):
#新最高级文件夹的名称
self.NewFile = 'output'
#原本最高级文件夹的名称
self.OriginalFile = 'input'
#遍历目录
def TraverseDirs(self):
#未检测到新最高级文件夹自动创建
if not os.path.exists(".\\" + self.NewFile):
os.makedirs(".\\" + self.NewFile)
#未检测到要处理最高级文件夹自动创建,并提示
if not os.path.exists(".\\" + self.OriginalFile):
os.makedirs(".\\" + self.OriginalFile)
print('未检测到' + self.OriginalFile + '文件夹,已经为你创建,请将需要操作文件放入,并重新打开软件')
os.system('pause')
#无异常开始遍历
else:
for root, dirs, files in os.walk('.\\' + self.OriginalFile):
if len(dirs) != 0:
self.CopyDirs(dirs, root)#复制目录
if len(files) != 0:
#遍历文件编辑
self.TraverseFiles(files, root)
#遍历文件
def TraverseFiles(self, files, root):
for name in files:
#把文件名与路径拼接
nameO = root + "\\" + name
#并用新路径替换原路径生成
#注:如果新文件与原来文件类型不一样,记得改后缀
nameN = re.sub(self.OriginalFile, self.NewFile, nameO)
#把两个路径导入给主函数
self.main(nameO, nameN)
#复制目录
def CopyDirs(self, dirs, root):
if not os.path.exists('.\\' + self.NewFile):
os.makedirs('.\\' + self.NewFile)
for D in dirs:
root_n = re.sub(self.OriginalFile, self.NewFile, root)
if not os.path.exists(root_n + '\\' + D):
os.makedirs(root_n + '\\' + D)
#主函数:这里就写了个简单的复制,根据自己需求改动就可以
def main(self, input, output):
print(input,'\n',output,'\n')
f_input = open(input, 'rb')
f_output = open(output, 'wb')
t = f_input.read()
f_output.write(t)
f_input.close()
f_output.close()
if __name__ == '__main__':
TF().TraverseDirs()