python讀取大文件 1. 較pythonic的方法,使用with結構 文件可以自動關閉 異常可以在with塊內處理 <! more 最大的優點 :對可迭代對象 f,進行迭代遍歷:for line in f,會自動地使用緩衝IO(buffered IO)以及記憶體管理,而不必擔心任何大文件的問題。 ...
python讀取大文件
- 較pythonic的方法,使用with結構
- 文件可以自動關閉
- 異常可以在with塊內處理
with open(filename, 'rb') as f: for line in f: <do someting with the line>
最大的優點:對可迭代對象 f,進行迭代遍歷:for line in f,會自動地使用緩衝IO(buffered IO)以及記憶體管理,而不必擔心任何大文件的問題。
There should be one – and preferably only one – obvious way to do it.
- 使用生成器generator
如果想對每次迭代讀取的內容進行更細粒度的處理,可以使用yield生成器來讀取大文件
def readInChunks(file_obj, chunkSize=2048):
"""
Lazy function to read a file piece by piece.
Default chunk size: 2kB.
"""
while True:
data = file_obj.read(chunkSize)
if not data:
break
yield data
f = open('bigFile')
for chunk in readInChunks(f):
do_something(chunk)
f.close()
- linux下使用split命令(將一個文件根據大小或行數平均分成若幹個小文件)
wc -l BLM.txt # 讀出BLM.txt文件一共有多少行
# 利用split進行分割
split -l 2482 ../BLM/BLM.txt -d -a 4 BLM_
# 將 文件 BLM.txt 分成若幹個小文件,每個文件2482行(-l 2482),文件首碼為BLM_ ,繫數不是字母而是數字(-d),尾碼繫數為四位數(-a 4)
# 按行數分割
split -l 300 large_file.txt new_file_prefix
# 文件大小分割
split -b 10m server.log waynelog
# 對文件進行合併:使用重定向,'>' 寫入文件 , '>>' 追加到文件中
cat file_prefix* > large_file
在工作中的日常: 用戶信息,log日誌緩存,等都是大文件
補充:linecache模塊
當讀取一個文件的時候,python會嘗試從緩存中讀取文件內容,優化讀取速度,提高效率,減少了I/O操作
linecache.getline(filename, lineno) 從文件中讀取第幾行,註意:包含換行符
linecache.clearcache() 清除現有的文件緩存
linecache.checkcache(filename=None) 檢查緩存內容的有效性,可能硬碟內容發生改變,更新了,如果沒有參數,將檢查緩存中的所有記錄(entries)
import linecache
linecache.getline(linecache.__file__, 8)
題目:
現給一個文件400M(該文件是由/etc/passwd生成的),統計其中root字元串出現的次數
import time
sum = 0
start = time.time()
with open('file', 'r') as f:
for i in f:
new = i.count('root')
sum+=new
end = time.time()
print(sum, end-start)
註:有時候這個程式比c,shell快10倍,原因就是,python會讀取cache中的數據,使用緩存在內部進行優化,減少i/o,提高效率
References : How to read a large file