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

版本记录

版本号 时间
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不是很了解的可以看下面几篇文章。

  • grep选项
  • grep命令详解
  • Linux 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)

具体可以参考

  • python 运行shell命令的几种方法(os.system、os.popen、subprocess、commands)
  • Python os.popen() 方法

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匹配的全部字符串,返回形式为数组。

具体可以参考

  • Python 正则表达re模块之findall()详解

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格式。

具体可以参考

  • Python str() 函数

2)遍历并输出到文件

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

  • Python for 循环语句
  • Python File(文件) 方法

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(二) —— 文件和目标字符的搜索输出(一))