Python多个嵌套文件夹内文件批量读取和生成(保留原本结构)

情况:

经常遇到这种情况,需要批量处理文件夹内的文件,并且处理后的也要按原本的相对路径存放,如下图:Python多个嵌套文件夹内文件批量读取和生成(保留原本结构)_第1张图片

解决思路

大概原理就是遍历一编最高级的文件夹,获取每个文件的路径(这里指与程序的相对路径),然后把原本最高级文件夹的名称替换为要保存的最高文件夹的名称,于此同时把原最高级文件夹下的子文件夹复制过去,防止保存文件时,找不到路径报错,如下:

.\第一级文件夹\第二级文件夹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()

Python多个嵌套文件夹内文件批量读取和生成(保留原本结构)_第2张图片
生成后的文件的截图就不展示,跟原本就是一模一样

你可能感兴趣的:(个人心得,python,开发语言)