Python讀取大文件

參考bobby python高級編程 第八章

通常做法

  1. 使用f.read()讀取全部數(shù)據(jù)斧拍,但是對于大文件會memory error
  2. 使用按行讀取的方式拧抖,實(shí)際上也會造成內(nèi)存溢出
    • for line in f.readlines() 將數(shù)據(jù)存到list中

    •  while True:
           line = f.readline()
           if not line:
               break
      
    • while True:
        chunk = f.read(1024)
        if not chunk:  #表示讀取到文件末尾了
            break
      

      使用read(size)的形式袱瓮,指定每次讀取的長度

Pythonic 的方法

with open(filename, 'rb') as f:
    for line in f:
        <do something with the line>

對可迭代對象 f筛谚,進(jìn)行迭代遍歷:for line in f族操,會自動地使用緩沖IO(buffered IO)以及內(nèi)存管理鸠窗,而不必?fù)?dān)心任何大文件的問題妓羊。

  • 這樣做僅限于讀取多行的大文件,如果大文件僅有一行還是會出現(xiàn)內(nèi)存溢出的問題

新學(xué)的方法

  • 利用read(size)的方式每次讀取size個(gè)字符稍计,同時(shí)假定一行大文件有固定的分隔符
def my_readlines(f, new_line):
    buf = ''  # 緩存每次讀取的數(shù)據(jù)和 上一次讀取數(shù)據(jù)分隔符后的剩余數(shù)據(jù)
    while True:
        while new_line in buf: # 判斷分隔符是否出現(xiàn)在緩存數(shù)據(jù)中
            pos = buf.index(new_line)  # 找到分隔符的位置
            yield buf[:pos]
            buf = buf[pos + len(new_line):]
        chunk = f.read(4096*10)
        if not chunk:  # 讀到了文件結(jié)尾
            yield buf   # yield最后一個(gè)分隔符后面的數(shù)據(jù)
            break
        buf += chunk

with open('test.txt', 'rb', encoding='utf-8') as f:
    for line in my_readlines(f, '#'):
        print(line)

Reference

  1. How to read large file, line by line in python
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載躁绸,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市净刮,隨后出現(xiàn)的幾起案子剥哑,更是在濱河造成了極大的恐慌,老刑警劉巖淹父,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件星持,死亡現(xiàn)場離奇詭異,居然都是意外死亡弹灭,警方通過查閱死者的電腦和手機(jī)督暂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穷吮,“玉大人逻翁,你說我怎么就攤上這事〖裼悖” “怎么了八回?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驾诈。 經(jīng)常有香客問我缠诅,道長,這世上最難降的妖魔是什么乍迄? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任管引,我火速辦了婚禮,結(jié)果婚禮上闯两,老公的妹妹穿的比我還像新娘褥伴。我一直安慰自己,他們只是感情好漾狼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布重慢。 她就那樣靜靜地躺著,像睡著了一般逊躁。 火紅的嫁衣襯著肌膚如雪似踱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天稽煤,我揣著相機(jī)與錄音核芽,去河邊找鬼。 笑死念脯,一個(gè)胖子當(dāng)著我的面吹牛狞洋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绿店,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼吉懊,長吁一口氣:“原來是場噩夢啊……” “哼庐橙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起借嗽,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤态鳖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后恶导,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浆竭,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年惨寿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邦泄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裂垦,死狀恐怖顺囊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蕉拢,我是刑警寧澤特碳,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站晕换,受9級特大地震影響午乓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闸准,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一益愈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恕汇,春花似錦腕唧、人聲如沸或辖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颂暇。三九已至缺谴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耳鸯,已是汗流浹背湿蛔。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留县爬,地道東北人阳啥。 一個(gè)月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像财喳,于是被迫代替她去往敵國和親察迟。 傳聞我的和親對象是個(gè)殘疾皇子斩狱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容