1. 程式人生 > >笨辦法學python3續 learn more python3 in hard way ex7 grep

笨辦法學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 不判斷 會全部輸出

在這裡插入圖片描述 版本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)

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的東西 其實上個實驗就應該搞清楚