????眾所周知微宝,python對(duì)文件的處理無非就是open或者file那一套添怔,打開關(guān)閉,讀取寫入徽龟,但是如果涉及的文件過于大了叮姑,直接read可能就直接將內(nèi)存撐爆了,所以這里也給大家提供一些方案來處理
1. Chunks——分塊處理
def read_in_chunks(filePath, chunk_size=1024*1024):
"""
Lazy function (generator) to read a file piece by piece.
Default chunk size: 1M
You can set your own chunk size
"""
file_object = open(filePath)
while True:
chunk_data = file_object.read(chunk_size)
if not chunk_data:
break
yield chunk_data
if __name__ == "__main__":
filePath = './path/filename'
for chunk in read_in_chunks(filePath):
process(chunk) # <do something with chunk>
2. 分段式反復(fù)讀取
????小文件可以直接調(diào)用read方法顿肺,但是如果不能確定文件大小戏溺,可以反復(fù)調(diào)用read(size)處理,針對(duì)配置文件等文本類型也可以使用readlines讀韧雷稹(返回列表)
for line in f.readlines():
process(line) # <do something with line>
3. with open()
????在使用python進(jìn)行大文件讀取時(shí),應(yīng)該讓系統(tǒng)來處理耕拷,使用最簡單的方式讼昆,交給解釋器,就管好自己的工作就行了骚烧。而with語句會(huì)自動(dòng)打開和關(guān)閉文件浸赫,包括拋出一個(gè)內(nèi)部塊異常。他將文件對(duì)象視為一個(gè)迭代器赃绊,會(huì)自動(dòng)的采用緩沖IO和內(nèi)存管理既峡,所以你不必?fù)?dān)心大文件。
#If the file is line based
with open(...) as f:
for line in f:
process(line) # <do something with line>
4. fileinput()
fileinput模塊可以對(duì)一個(gè)或多個(gè)文件中的內(nèi)容進(jìn)行迭代碧查、遍歷等操作运敢。
????該模塊的input()函數(shù)有點(diǎn)類似文件readlines()方法,但它是一個(gè)可迭代對(duì)象忠售,即每次只生成一行传惠,需要用for循環(huán)迭代。在碰到大文件的讀取時(shí)稻扬,無疑效率更高效卦方。用fileinput對(duì)文件進(jìn)行循環(huán)遍歷,格式化輸出泰佳,查找盼砍、替換等操作尘吗,非常方便。
import fileinput
for line in fileinput.input(['sum.log']):
print line