美文网首页
python遍历读取文件并且正则

python遍历读取文件并且正则

作者: Abler | 来源:发表于2018-03-08 11:03 被阅读213次

    1.最近由于笔者统计代码中的xxx功能,自己动手写了个python脚本.主要功能是通过读取某文件夹下面所有文件以及子文件夹文件的内容,然后用正则表达式进行正则,将正则后的内容保存到本地(保存的文件名和源文件名一致). 如果有需求请自行合并文件

    #!/usr/bin/python
    # -*- coding: UTF-8 -*- 
    
    import os
    import re
    
    fileNames = "/Users/ex/Downloads/m"  #文件夹
    regString = "\[ToastView.*?\];"  #正则表达式
    out_file_dir = "/Users/ex/Downloads/mm/"  #输出文件夹
    
    def regularFile(fileStr,regStr,outFilePath):#输入文件夹,正则,输出文件夹
        fileOpen1 = open(fileStr)
        file_name_list = fileStr.split("/")#分割文件路径
        out_file_name = outFilePath + "/" + file_name_list[len(file_name_list) - 1]#输出文件名
        txt = fileOpen1.read()#读取文件内容
        searchResult = re.findall(regStr,txt)
        if len(searchResult):#正则表达式结果判断
            endstr = ""
            for result in searchResult:
                endstr = endstr + result + "\n"
            fileOpen2 = open(out_file_name,"w")
            fileOpen2.write(endstr)#写入新的文件
            fileOpen1.close()
            fileOpen2.close()
    
    #定义一个函数,path为你的路径; 返回所有文件和子文件路径,
    def traversalDir_FirstDir(path):  
        list1 = os.walk(path)
        fileList = []
        for root, dirs, files in os.walk(path, topdown=False):
            for name in files:
                full_path = os.path.join(root, name)
                if not(os.path.isdir(full_path)):#不是目录
                    fileList.append(full_path)
            for name in dirs:
                full_path = os.path.join(root, name)
                if not(os.path.isdir(full_path)):#不是目录
                    fileList.append(full_path)
        return fileList
    allFileList = traversalDir_FirstDir(fileNames)#获得所有文件路径
    
    for filepath in allFileList:
        if ".m" in filepath:
            regularFile(filepath,regString,out_file_dir)
     
    
    /*!
     * 遍历读取文件并且正则  nodejs版本
     * Released under the MIT license
     * 
     * Date: 2018-03-08
     */
    
    const filesystem = require("fs");
    
    const fileDir = walk("/Users/ex/Downloads/demo");// 路径
    const regx = /da/g;// 正则没有 ''
    
    /**
     * 异步操作将正则结果写入文件
     */
    /*regularFile(fileDir,/da/g,function (array) {
        if (array == null) {
            return;
        }
        writeToLocalFile(array,"a.txt")
    });*/
    
    /**
     * 同步操作将正则结果写入文件
     */
    const regxFileArray = regularFileSync(fileDir,regx);
    writeToLocalFile(regxFileArray,"a.txt")
    
    /**
     * 同步读取文件
     * @param {文件数组} fileArray 
     * @param {正则表达式} regx 
     */
    function regularFileSync(fileArray,regx) {
        let arr = [];
        for (let index = 0; index < fileArray.length; index++) {
            const element = fileArray[index];// 文件路径名
            const data = filesystem.readFileSync(element,"utf-8");
            const stringOfFile = data.toString();
            const newString = matchStr(regx,stringOfFile);
            arr = arr.concat(newString);
        }
        return arr;
    }
    
    /**
     * 异步读取文件并且正则
     * @param {文件数组} fileArray 
     * @param {正则表达式} regx 
     * @param {回调函数} func_regx_txt
     */
    function regularFile(fileArray,regx,func_regx_txt) {  
        for (let index = 0; index < fileArray.length; index++) {
            const element = fileArray[index];// 文件路径名
            filesystem.readFile(element,function (err,data) {
                if (err) return console.error(err);
                const stringOfFile = data.toString(); // 字符串
                func_regx_txt(matchStr(regx,stringOfFile)); // 匿名函数
            })
        }
    }
    /**
     * 遍历目录
     * @param {需要遍历的目录} dir 
     */
    function walk(dir) {  
        var children = []  
        filesystem.readdirSync(dir).forEach(function(filename){  
            var path = dir+"/"+filename  
            var stat = filesystem.statSync(path)  
            if (stat && stat.isDirectory()) {  
                // 由于有递归不能用箭头函数
                children = children.concat(walk(path))  
            }  
            else {  
                children.push(path)  
            }  
        })  
      
        return children  
    }
    /**
     * 正则
     * @param {正则表达式} regx 
     * @param {需要正则的字符串} string 
     */
    function matchStr(regx,string) {
        const res = string.match(regx);
        return res;
    }
    /**
     * 将数组转为字符串 \n连接 写入本地文件
     * @param {数组} arr 
     * @param {文件路径} filePath 
     */
    function writeToLocalFile(arr, filePath) {
        const txt = arr.join("\n");
        filesystem.writeFile(filePath,txt,"utf-8",(err) => {
            //写入错误,抛出错误
            if (err) throw err;
        })
    }
    
    源文件
    正则之后文件

    2.替换字符串功能

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import os,base64  
    openSourcesFile = open('/Users/ex/Downloads/1.txt')#打开源文件
    txtDesFile = open('/Users/ex/Downloads/2.txt','w')#打开需要写入的文件
    sourcesTxt = openSourcesFile.read()#读入文件
    replaceTxt = sourcesTxt.replace('\n','')
    txtDesFile.write(replaceTxt)#写入txt文件
    
    imgdata=base64.b64decode(replaceTxt)  
    fileDes=open('/Users/ex/Downloads/b.jpg','wb')#写入图片文件
    fileDes.write(imgdata)
    #关闭文件
    fileDes.close()
    openSourcesFile.close()
    txtDesFile.close()
    

    相关文章

      网友评论

          本文标题:python遍历读取文件并且正则

          本文链接:https://www.haomeiwen.com/subject/ifgefftx.html