版本记录
版本号 | 时间 |
---|---|
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
)并返回列表,该列表可以由 Python
的 for... 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
的文件和目标字符的搜索输出,感兴趣的给个赞或者关注~~~