日常小發現(一)連續兩次readlines(),第二次返回值為空


  今天在用py處理log的時候,突然發現一個有趣的現象!

  現象:當我們用readlines()讀一個文件的時候,連續調用兩遍,會出現第二個list是空的現象。

  例子:

 

file_obj = open(r"./1.txt")
for i in file_obj.readlines():
    print 1
for i in file_obj.readlines():
    print 2
file_obj.close()

 

  解釋:此時我們會發現,2是無法打印出來的,原來py中也存在類似c/c++中考慮指針位置的問題

  其實這個很好理解,當我門打開文件並遍歷一遍后,文件指針自然會來到文件得最為尾端,在c/c++中我們只需將指針位置重新挪到開頭即可,可是我們是python呀,怎么可以那么蠢!

  解決方法:

  (一)
將readlines()返回得對象存儲起來

    例如1:
list1 = open(r"./1.txt").readlines()
for i in list1:
    print 1
for i in list1:
    print 2
 
        
  
    例如2:
file_obj = open(r"./1.txt")
list1 = file_obj.readlines()
for i in list1:
    print 1
for i in list1:
    print 2
file_obj.close()

  (二)將文件打開兩次  

 

     例如3:

with open('./1.txt', 'r') as f:
    for i in f.readlines():
        print 1
with open('./1.txt', 'r') as f:
    for i in f.readlines():
        print 2
       例如4:
for i in open(r"./1.txt").readlines():
    print 1
for i in open(r"./1.txt").readlines():
    print 2
 
        

  總結:前兩個例子只需要對文件打開一次,后兩個例子等於對文件進行了兩次打開,但是四種方法都可以做到我們想要的結果。

  推薦:當處理的log數據量不大的時候,個人推薦使用例2,因為只需要打開一次,之后都是對對象進行操作了。

             當處理的文件很大的時候建議使用例3,因為with有神奇的用處,不但可以自動調用close()方法,還可以有保險的作用,當文件特別大,內存不夠的時候,它可以自動限制每次的大小,使得程序順利的走下去

  問題:例1和例4中在這里想向大神們提出個問題,從代碼量上這兩種無疑少了很多,但是問題是雖然可以正常的得到我們想要的,可是文件打開之后終究是沒有關閉的,因為沒有file對象,導致無法調用close(),這樣會造成怎樣的影響?最終又是誰去處理這個問題?我的理解可能就是py的強大最終程序結束的時候自我處理了,那這樣寫會不會很消耗資源,更嚴重的是會不會導致py的內存泄露呢?目前我的認知py怎么可能內存泄漏,畢竟它那么強大。哈哈哈!!!


    




免責聲明!

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



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