python被遊標坑了,python遊標坑
為了方便,這次就不單獨寫指令碼了,直接一步一步執行下來就好了
先說下遊標,就是一個指標,比如我有
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或二分法才是正確的選擇,當然最快的一定是樹查詢