為了方便,這次就不單獨寫腳本了,直接一步一步執行下來就好了先說下游標,就是一個指針,比如我有1234每條占一行,那麼初始游標預設是在1的位置,當read(1)後,游標自動向下next,現在指在2的位置,依次類推,然後是3,4直到最後,除非強制移動游標,否則游標不會再返回的今天寫了一個腳本,具體就是有 ...
為了方便,這次就不單獨寫腳本了,直接一步一步執行下來就好了
先說下游標,就是一個指針,比如我有
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或二分法才是正確的選擇,當然最快的一定是樹查詢