笨辦法學python3續 learn more python3 in hard way ex7 grep
阿新 • • 發佈:2018-12-11
這次我們要用程式碼實現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)
關於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的東西 其實上個實驗就應該搞清楚