笨办法学python3续 learn more python3 in hard way ex7 grep

这次我们要用代码实现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

compile方法

search
关于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])

这里用了上次的路径
就放个截图吧
. 是当前路径的意思 也就是运行的py文件里

存在一些问题我要关注:
argparse的方法 还有match()和search()的 区别
和rglob等pathlib的东西 其实上个实验就应该搞清楚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值