国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

使用Python讀取大文件的方法

2020-01-04 15:51:40
字體:
供稿:網(wǎng)友

背景

最近處理文本文檔時(文件約2GB大小),出現(xiàn)memoryError錯誤和文件讀取太慢的問題,后來找到了兩種比較快Large File Reading 的方法,本文將介紹這兩種讀取方法。

準備工作

  我們談到“文本處理”時,我們通常是指處理的內(nèi)容。Python 將文本文件的內(nèi)容讀入可以操作的字符串變量非常容易。文件對象提供了三個“讀”方法: .read()、.readline() 和 .readlines()。每種方法可以接受一個變量以限制每次讀取的數(shù)據(jù)量,但它們通常不使用變量。 .read() 每次讀取整個文件,它通常用于將文件內(nèi)容放到一個字符串變量中。然而.read() 生成文件內(nèi)容最直接的字符串表示,但對于連續(xù)的面向行的處理,它卻是不必要的,并且如果文件大于可用內(nèi)存,則不可能實現(xiàn)這種處理。下面是read()方法示例:

try:f = open('/path/to/file', 'r')print f.read()finally:if f:f.close() 

  調(diào)用read()會一次性讀取文件的全部內(nèi)容,如果文件有10G,內(nèi)存就爆了,所以,要保險起見,可以反復調(diào)用read(size)方法,每次最多讀取size個字節(jié)的內(nèi)容。另外,調(diào)用readline()可以每次讀取一行內(nèi)容,調(diào)用readlines()一次讀取所有內(nèi)容并按行返回list。因此,要根據(jù)需要決定怎么調(diào)用。

  如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反復調(diào)用read(size)比較保險;如果是配置文件,調(diào)用readlines()最方便:

for line in f.readlines():process(line) #
  

分塊讀取

處理大文件是很容易想到的就是將大文件分割成若干小文件處理,處理完每個小文件后釋放該部分內(nèi)存。這里用了iter 和 yield:

def read_in_chunks(filePath, chunk_size=1024*1024):"""Lazy function (generator) to read a file piece by piece.Default chunk size: 1MYou can set your own chunk size"""file_object = open(filePath)while True:chunk_data = file_object.read(chunk_size)if not chunk_data:breakyield chunk_dataif __name__ == "__main__":filePath = './path/filename'for chunk in read_in_chunks(filePath):process(chunk) # <do something with chunk>

使用With open()

with語句打開和關(guān)閉文件,包括拋出一個內(nèi)部塊異常。for line in f文件對象f視為一個迭代器,會自動的采用緩沖IO和內(nèi)存管理,所以你不必擔心大文件。

代碼如下:

#If the file is line basedwith open(...) as f:  for line in f:    process(line) # <do something with line>

優(yōu)化

面對百萬行的大型數(shù)據(jù)使用with open 是沒有問題的,但是這里面參數(shù)的不同也會導致不同的效率。經(jīng)過測試發(fā)先參數(shù)為"rb"時的效率是"r"的6倍。由此可知二進制讀取依然是最快的模式。

with open(filename,"rb") as f:   for fLine in f:     pass 

測試結(jié)果:rb方式最快,100w行全遍歷2.9秒。基本能滿足中大型文件處理效率需求。如果從rb(二級制讀取)讀取改為r(讀取模式),慢5-6倍。

結(jié)論

  在使用python進行大文件讀取時,應該讓系統(tǒng)來處理,使用最簡單的方式,交給解釋器,就管好自己的工作就行了。同時根據(jù)不同的需求可以選擇不同的讀取參數(shù)進一步獲得更高的性能。


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 林甸县| 洪泽县| 双江| 沽源县| 绥化市| 汨罗市| 淳安县| 乐平市| 遂川县| 黄石市| 富宁县| 峨眉山市| 平顶山市| 家居| 龙里县| 米泉市| 赞皇县| 莒南县| 清涧县| 大连市| 安乡县| 莒南县| 会泽县| 闸北区| 喀什市| 安乡县| 浮梁县| 梅河口市| 霍邱县| 建昌县| 皮山县| 凌海市| 揭阳市| 阜康市| 景德镇市| 策勒县| 民权县| 广州市| 浏阳市| 琼中| 葫芦岛市|