这次我们要用代码实现grep功能(windows应该没有)
zed 提供了两个思路,一个futher
两个思路是用
>>> 'finding'.find('ing')
4
另外一种是用re module
我用了三个py文件来实现
最初的版本:
import argparse
parser=argparse.ArgumentParser()
parser.add_argument('files',metavar='F',type=str,nargs='+')
parser.add_argument('-s','--sum',help='sum',action='store_true')
parser.add_argument('text',type=str)
args=parser.parse_args()
print(args)
sum=0
lines=open(args.files[0])
for line in lines.readlines():
if line.find(args.text) >=0:
print(f"\t{line}",end=" ")
sum+=1
if args.sum:
print(sum)
这个代码我学会了两个事情
1.虽然用了几次argparse
但是还是有些地方有问题,现在还是依然存在一些小问题
positional argument 和optional argument是重点
而且我们存的参数是一个数组形式存在的(不确定)
2.find()找不到会输出-1
不判断 会全部输出
这里附上argparse的中文讲解
mac翻不了墙=- =
https://www.cnblogs.com/yymn/p/8056487.html
版本2:
import argparse
import re
def parse_args():
parser=argparse.ArgumentParser()
parser.add_argument('files',metavar='F',type=str,nargs='+')
parser.add_argument('-s','--sum',help='sum',action='store_true')
parser.add_argument('text',type=str)
return parser.parse_args()
args=parse_args()
def find_in_file(filename,key):
sum=0
lines=open(filename).readlines()
expr=re.compile(key)
for line in lines:
if expr.search(line):
print(line,end=" ")
sum+=1
if args.sum:
print(sum)
find_in_file(args.files[0],args.text)
可以发现 我们用了re module的compile方法和search方法
并且放在了def内
官方文档:
https://docs.python.org/3/library/re.html
关于search和match的区别 再说 我先放上
运行截图:
final editon:
import re
import sys
import argparse
from pathlib import Path
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('pattern', type=str, nargs=1)
parser.add_argument('start', type=str, nargs=1)
parser.add_argument('-r', action='store_true')
return parser.parse_args()
def find_in_file(name, pattern):
try:
lines = open(name).readlines()
except UnicodeDecodeError:
print(f"Binary file {name} matches.")
return
expr = re.compile(pattern)
for line in lines:
if expr.search(line):
print(line, end="")
args = parse_args()
if args.r:
start_path = Path(args.start[0])
for f in start_path.rglob("*"):
if f.is_file():
find_in_file(f, args.pattern[0])
else:
find_in_file(args.start[0], args.pattern[0])
这里用了上次的路径
就放个截图吧
存在一些问题我要关注:
argparse的方法 还有match()和search()的 区别
和rglob等pathlib的东西 其实上个实验就应该搞清楚