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或二分法才是正確的選擇,當然最快的一定是樹查詢

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM