小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python 讀取大文件

 oskycar 2018-04-25

簡述

在處理大數(shù)據(jù)時,有可能會碰到好幾個 G 大小的文件。如果通過一些工具(例如:NotePad++)打開它,會發(fā)生錯誤,無法讀取任何內(nèi)容。

那么,在 Python 中,如何快速地讀取這些大文件呢?

版權(quán)所有:一去丶二三里,轉(zhuǎn)載請注明出處:http://blog.csdn.net/liang19890820

一般的讀取

讀取文件,最常見的方式是:

with open('filename', 'r', encoding = 'utf-8') as f:
    for line in f.readlines():
        do_something(line)
  • 1
  • 2
  • 3

但是,當完成這一操作時,readlines() 方法(read() 也一樣)會將整個文件加載到內(nèi)存中。在文件較大時,往往會引發(fā) MemoryError(內(nèi)存溢出)。

那么,如何避免這個問題?

使用 fileinput 模塊

稍微好點兒的方式是使用 fileinput 模塊:

import fileinput

for line in fileinput.input(['filename']):
    do_something(line)
  • 1
  • 2
  • 3
  • 4

調(diào)用 fileinput.input() 會按照順序讀取行,但是在讀取之后不會將它們保留在內(nèi)存中。

逐行讀取

除此之外,也可使用 while() 循環(huán)和 readline() 來逐行讀?。?/p>

with open('filename', 'r', encoding = 'utf-8') as f:
    while True:
        line = f.readline()  # 逐行讀取
        if not line:  # 到 EOF,返回空字符串,則終止循環(huán)
            break
        do_something(line)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

指定每次讀取的長度

有時,可能希望對每次讀取的內(nèi)容進行更細粒度的控制。

在這種情況下,可以使用 iteryield

def read_in_chunks(file_obj, chunk_size = 2048):
    """
    逐件讀取文件
    默認塊大?。?KB
    """
    while True:
        data = file_obj.read(chunk_size)  # 每次讀取指定的長度
        if not data:
            break
        yield data

with open('filename', 'r', encoding = 'utf-8') as f:
    for chuck in read_in_chunks(f):
        do_something(chunk)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

自動管理

這才是 Pythonci 最完美的方式,既高效又快速:

with open('filename', 'r', encoding = 'utf-8') as f:
    for line in f:
        do_something(line)
  • 1
  • 2
  • 3

with 語句句柄負責打開和關(guān)閉文件(包括在內(nèi)部塊中引發(fā)異常時),for line in f 將文件對象 f 視為一個可迭代的數(shù)據(jù)類型,會自動使用 IO 緩存和內(nèi)存管理,這樣就不必擔心大文件了。

更多參考

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多