為了方便,這次就不單獨寫腳本了,直接一步一步執行下來就好了
先說下游標,就是一個指針,比如我有
1
2
3
4
每條占一行,那么初始游標默認是在1的位置,當read(1)后,游標自動向下next,現在指在2的位置,依次類推,然后是3,4直到最后,除非強制移動游標,否則游標不會再返回的
今天寫了一個腳本,具體就是有兩個txt,a.txt和b.txt,從a.txt里面取值,去b.txt里面查看,是否存在,如果存在就把這條print出來
上例子
#先創建個a.txt file_a = open('a.txt','w') #在當前目錄下創建a.txt,寫入模式,如果不確定目錄先os.getcwd(),不然找不到不怪我哦 file_a.write('3\n9\n5\n4\n') #寫入數據 file_a.close() file_b = open('b.txt','w') for i in range(10): file_b.write(str(i)+'\n') #寫入1\n2\n3\n....9\n file_b.close() #下面來讀取匹配下 file_a = open('a.txt','r') file_b = open('b.txt','r') for x in file_a: x = x.strip() for y in file_b: y = y.strip() if x == y: print x break #結果是3\n9\n,只有3和9,這下懵逼了,應該是3\n9\n5\n4\n啊 file_a.close() file_b.close() #結果這破玩意我改了一個小時,怎么都是3,然后覺得這樣沒有啥效果,仔細想了一下,原來是游標的問題,尼瑪的 #我來解釋下,因為file_a的類型是file,而file類型是使用指針的,就是和我上面說的一樣,除非強制移動,否則游標不會再返回的 #就是說在嵌套循環里面for y in file_b的時候匹配到3了,那么游標停在3上,下一個是9,那么第二輪是從3開始向下找,找到9,9之后就再沒有了,所以無論怎么匹配也匹配不到的 #知道原因在哪里就好辦了,有兩種辦法,先說第一種把,用seek(0)將游標移動到開始 file_a = open('a.txt','r') file_b = open('b.txt','r') for x in file_a: x = x.strip() for y in file_b: y = y.strip() if x == y: print x file_b.seek(0) break file_a.close() file_b.close() #第二種是用readlines,把文件里的數據按行read成list,list是沒有游標概念的,list只有下標,每次都會從頭循環 file_a = open('a.txt','r') file_b = open('b.txt','r') file_b_list = file_b.readlines() #只改file_b就可以了,因為a是主表 for x in file_a: x = x.strip() for y in file_b_list: y = y.strip() if x == y: print x break file_a.close() file_b.close() #我建議用第二種,因為第一種需要有游標重置的動作,雖然幾條沒有影響,不過如果是幾千萬的話影響應該會很大把,不過話說回來了,幾千萬誰還會用嵌套循環呢,hash或二分法才是正確的選擇,當然最快的一定是樹查詢
