美文网首页
Python(二) —— 文件和目标字符的搜索输出(一)

Python(二) —— 文件和目标字符的搜索输出(一)

作者: 刀客传奇 | 来源:发表于2022-02-24 20:54 被阅读0次

    版本记录

    版本号 时间
    V1.0 2022.02.24 星期四

    前言

    Python荷兰数学计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。

    Python解释器易于扩展,可以使用C语言C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python 也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码机器码。感兴趣的可以看下面几篇文章。
    1. Python(一) —— Python简介(一)

    开始

    首先看下主要内容:

    这一篇我们就在已有的Xcode工程里,随便找个文件,加一个注释。下面我们就写一个python脚本去执行文件搜索并找到这个目标字符。

    //以qq开头?结尾的字符串
    qq你可以找到我吗?
    

    下面我们就尝试开始写哈。


    实现

    1. 确认目标文件夹

    我们要在一个文件夹里找东西,所以要给出来要找的目标字符串所在的文件夹目录,我这里是:

    if __name__ == '__main__':
        writeTargetString("/Users/xxx/Desktop/Demo/JJTest")
    

    这个文件夹地址会在Python demo里以字符串的形式写死。

    2. 搜索

    下面就是对目标文件夹进行搜索,这里我们用的是grep

    主要代码如下:

    def exeShell(filepath):
        shell = '''grep -R --include="*.h" 'qq' %s''' % filepath 
        pathList = os.popen(shell).readlines()
        return pathList
    

    该方法的作用就是执行终端shell命令去目标文件夹去搜索。采用的是grep+正则的方式进行搜索匹配。

    grep不是很了解的可以看下面几篇文章。

    这里就是搜索.h结尾的文件,和带有qq的字符串。

    1)os.popen() 方法

    os.popen()方法用于从一个命令打开一个管道。
    Unix,Windows中有效,具体的语法格式如下:

    os.popen(command[, mode[, bufsize]])
    
    • command -- 使用的命令。
    • mode -- 模式权限可以是 'r'(默认) 或 'w'。
    • bufsize -- 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。

    返回值为一个文件描述符号为fd的打开的文件对象。

    popen() 创建一个管道,通过fork一个子进程,然后该子进程执行命令。返回值在标准IO流中,该管道用于父子进程间通信。父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数(w或r)

    具体可以参考

    2)readlines() 方法

    readlines()方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Pythonfor... in ...结构进行处理。

    如果碰到结束符 EOF 则返回空字符串。

    • 语法:
    fileObject.readlines( );
    
    • 参数:无
    • 返回值:返回列表,包含所有的行。

    3. 定位目标

    下面就是根据上面的数据,定位到我们要找的目标字符串。采用的也是正则匹配和findall函数。具体代码如下:

    def getTargetList(template):
        rule = r'qq.*\?'
        resultList = re.findall(rule,template)
        return resultList
    

    1)正则表达式

    qq.*\?
    

    上面这个表达式匹配的就是以qq开头,?结尾的任意字符串。中间可以是任意字符也可以是没有字符。

    2)findall函数

    它在re.py中有定义:

    def findall(pattern, string, flags=0):
        """Return a list of all non-overlapping matches in the string.
    
        If one or more capturing groups are present in the pattern, return
        a list of groups; this will be a list of tuples if the pattern
        has more than one group.
    
        Empty matches are included in the result."""
    
        return _compile(pattern, flags).findall(string)
    

    返回string中所有与pattern匹配的全部字符串,返回形式为数组。

    具体可以参考

    4. 输出到文件中

    经过搜索和定位后,下面我们要做的就是输出到一个txt文件中。具体demo如下:

    def writeTargetString(filename):
        allList = str(exeShell(filename))
        print("allList = \n %s \n" % allList)
        targetList = getTargetList(allList)
        for item in targetList:
            subStr = str(item)
            print("\n %s \n" % subStr)
            f = open("/Users/xxx/Desktop/Demo/JJTest/a.txt" , "a")
            f.write(subStr)
            f.close()
    
    if __name__ == '__main__':
        writeTargetString("/Users/xxx/Desktop/Demo/JJTest")
    

    1)str方法

    str()函数将对象转化为适于人阅读的形式。

    • 语法:
    class str(object='')
    
    • 参数:object -- 对象。
    • 返回值:返回一个对象的string格式。

    具体可以参考

    2)遍历并输出到文件

    最后对找到的字符串数组进行遍历,并输出到目标txt文件中。

    5. 完整脚本demo

    我们还是看一下我写的一个简单的脚本demo

    import re,os
    import sys
    import subprocess 
    
    def getTargetList(template):
        rule = r'qq.*\?'
        resultList = re.findall(rule,template)
        return resultList
    
    def exeShell(filepath):
        shell = '''grep -R --include="*.h" 'qq' %s''' % filepath 
        pathList = os.popen(shell).readlines()
        return pathList
    
    def writeTargetString(filename):
        allList = str(exeShell(filename))
        print("allList = \n %s \n" % allList)
        targetList = getTargetList(allList)
        for item in targetList:
            subStr = str(item)
            print("\n %s \n" % subStr)
            f = open("/Users/xxx/Desktop/Demo/JJTest/a.txt" , "a")
            f.write(subStr)
            f.close()
    
    if __name__ == '__main__':
        writeTargetString("/Users/xxx/Desktop/Demo/JJTest")
    

    6. 查看结果

    下面我们就查看结果

    首先看下控制台输出

    然后我们去看一下是否有对应的txt文件

    可以看见有对应的txt文件和相应的正确写入。

    后记

    本篇主要讲述了基于Python的文件和目标字符的搜索输出,感兴趣的给个赞或者关注~~~

    相关文章

      网友评论

          本文标题:Python(二) —— 文件和目标字符的搜索输出(一)

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