Python練習-面向過程編程-模擬Grep命令


其實這個面向過程編寫程序,是編寫程序的基礎,所以一定要好好掌握

此程序涉及知識點:裝飾器,生成器,協程器應用

 1 # 編輯者:閆龍
 2 import os
 3 Distinct = [] #定義一個列表用於判斷重復的文件
 4 def AutoNext(Target): #生成器的Next裝飾器
 5     def NextTarget(*args):
 6         res = Target(*args) #res得到Target(*args)的執行結果(Target())
 7         next(res)#讓res進行一次next到yield的操作
 8         return res#返回res當前的狀態(next到yield的狀態)
 9     return NextTarget
10 
11 @AutoNext#調用生成器的Next裝飾器
12 def InputGetPath(Target):
13     InputPath = yield #InputPath等待yield的返回值
14     PathGen = os.walk(InputPath)#將InputPath中的目錄子目錄和文件游走后返回列表[路徑,[子目錄],[文件]]
15     for i in PathGen:
16         for j in i[-1]:
17             FilePath ="%s\\%s"%(i[0],j) #將格式化好的路徑傳遞給FilePath
18             Target.send(FilePath) #使用Send方式傳值給Target中的yield
19 
20 @AutoNext
21 def OpenFile(Target):
22     while True:
23         F = yield#F等待yild的返回值,這里是由InputPath()中的Target.send傳遞過來的
24         with open(F) as f:#將F路徑的文件打開賦值給f
25             Target.send((f,F))#由於最后要顯示文件路徑所以,這里要以元組的方式傳遞兩個值給下一個Target中的yield,f是文件句柄,F是文件路徑
26             #("asdfasdf","F:\\a\\a.txt")
27 @AutoNext
28 def CatFile(Target):
29     while True:
30         f,F = yield#上方的OpenFile已經將f和F值傳遞到了這里的yield並返回給f,F,既然OpenFile傳遞了兩個值,這里也要用兩個值接收
31         #f="asdfasdf",F="F:\\a\\a.txt"
32         for i in f :
33             Target.send((i,F))#與OpenFile中的send一樣,將i的值和F的值傳遞給下一個Target中的yield
34 
35 @AutoNext
36 def GrepLine(Target,chioce):#chioce是用戶輸入的即將檢索的關鍵字
37     while True:
38         line,F = yield#同樣還是要用兩個參數來接收yield的返回值
39         if (chioce in line):
40             Target.send(F) #這里就不需要傳遞兩個值了,因為最后的Target只需要的到文件路徑就可以了
41 
42 @AutoNext
43 def PrintInfo():
44     while True:
45         F = yield
46         if(F not in Distinct): #當F這個路徑值不存在Distinct中時將F追加到Distinct列表中
47             Distinct.append(F)
48             print(F)
49 
50 chioce = input("請輸入你要檢索的關鍵字:")
51 #這里的調用其實,不難,仔細分析一下就能很容易的理解了
52 Gene = InputGetPath(OpenFile(CatFile(GrepLine(PrintInfo(),chioce))))
53 try: #針對Stop告警的異常處理
54     Gene.send("F:\\a")
55 except StopIteration:
56     print("檢索完成")

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com