今天在用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怎么可能內存泄漏,畢竟它那么強大。哈哈哈!!!