欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python讀取大文件的方法

 更新時(shí)間:2018年02月11日 14:21:51   作者:DB樂(lè)之者  
這篇文章主要介紹了使用Python讀取大文件的方法,需要的朋友可以參考下

背景

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

準(zhǔn)備工作

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

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

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

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

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

分塊讀取

處理大文件是很容易想到的就是將大文件分割成若干小文件處理,處理完每個(gè)小文件后釋放該部分內(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: 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>

使用With open()

with語(yǔ)句打開(kāi)和關(guān)閉文件,包括拋出一個(gè)內(nèi)部塊異常。for line in f文件對(duì)象f視為一個(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>

優(yōu)化

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

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

測(cè)試結(jié)果:rb方式最快,100w行全遍歷2.9秒?;灸軡M足中大型文件處理效率需求。如果從rb(二級(jí)制讀取)讀取改為r(讀取模式),慢5-6倍。

結(jié)論

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

相關(guān)文章

  • Python+pyecharts繪制雙動(dòng)態(tài)曲線教程詳解

    Python+pyecharts繪制雙動(dòng)態(tài)曲線教程詳解

    pyecharts 是一個(gè)用于生成 Echarts 圖表的類庫(kù)。Echarts 是百度開(kāi)源的一個(gè)數(shù)據(jù)可視化 JS 庫(kù)。用 Echarts 生成的圖可視化效果非常棒。本文將用pyecharts繪制雙動(dòng)態(tài)曲線,需要的可以參考一下
    2022-06-06
  • python?selenium模擬點(diǎn)擊問(wèn)題解決方案

    python?selenium模擬點(diǎn)擊問(wèn)題解決方案

    這篇文章主要介紹了python?selenium模擬點(diǎn)擊問(wèn)題,涉及到安裝谷歌瀏覽器和瀏覽器驅(qū)動(dòng)的相關(guān)知識(shí)介紹,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Python解決爬蟲(chóng)程序卡死問(wèn)題

    Python解決爬蟲(chóng)程序卡死問(wèn)題

    這篇文章主要介紹了Python解決爬蟲(chóng)程序卡死問(wèn)題,文章圍繞主題展開(kāi)詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Python使用Pendulum優(yōu)雅處理日期與時(shí)間

    Python使用Pendulum優(yōu)雅處理日期與時(shí)間

    在日常開(kāi)發(fā)中,日期和時(shí)間的處理一直是讓人頭疼的事情,本文將全面介紹?pendulum?的特點(diǎn),用法以及典型應(yīng)用場(chǎng)景,希望可以幫助大家在實(shí)際項(xiàng)目中優(yōu)雅地處理時(shí)間邏輯
    2025-06-06
  • 極速整理文件Python自動(dòng)化辦公實(shí)用技巧

    極速整理文件Python自動(dòng)化辦公實(shí)用技巧

    當(dāng)涉及到自動(dòng)化辦公和文件整理,Python確實(shí)是一個(gè)強(qiáng)大的工具,在這篇博客文章中,將深入探討極速整理文件!Python自動(dòng)化辦公新利器這個(gè)話題,并提供更加豐富和全面的示例代碼,以便讀者更好地理解和運(yùn)用這些技巧
    2024-01-01
  • Python?os和os.path模塊詳情

    Python?os和os.path模塊詳情

    這篇文章主要介紹了Python?os和os.path模塊詳情,文章圍繞主題展開(kāi)詳細(xì)的相關(guān)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-04-04
  • 使用Python設(shè)置Excel工作表的頁(yè)眉和頁(yè)腳的代碼示例

    使用Python設(shè)置Excel工作表的頁(yè)眉和頁(yè)腳的代碼示例

    在處理和分析數(shù)據(jù)時(shí),Excel作為一款功能強(qiáng)大的工具,被廣泛應(yīng)用于各個(gè)領(lǐng)域,當(dāng)涉及到打印或分享工作表時(shí),為文檔添加專業(yè)的頁(yè)眉和頁(yè)腳不僅能提升文件的視覺(jué)效果,本文將介紹如何使用Python設(shè)置Excel工作表的頁(yè)眉和頁(yè)腳,需要的朋友可以參考下
    2024-12-12
  • python中的list字符串元素排序

    python中的list字符串元素排序

    這篇文章主要介紹了python中的list字符串元素排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python構(gòu)造函數(shù)及解構(gòu)函數(shù)介紹

    Python構(gòu)造函數(shù)及解構(gòu)函數(shù)介紹

    這篇文章主要介紹了Python構(gòu)造函數(shù)及解構(gòu)函數(shù)介紹,本文只是講解構(gòu)造及解構(gòu)函數(shù)的簡(jiǎn)單知識(shí),需要的朋友可以參考下
    2015-02-02
  • python [:3] 實(shí)現(xiàn)提取數(shù)組中的數(shù)

    python [:3] 實(shí)現(xiàn)提取數(shù)組中的數(shù)

    今天小編就為大家分享一篇python [:3] 實(shí)現(xiàn)提取數(shù)組中的數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11

最新評(píng)論