簡體   English   中英

Python 2.7:如何一次只從文件中讀取幾行?

[英]Python 2.7: how to read only a few lines at a time from a file?

例如,我在一個文件中有 2,000 行,我想一次讀取 500 行,並在讀取另外 500 行之前對這 500 行做一些事情。 我想知道是否有人會編寫一些快速代碼供我學習。 謝謝!

您可以使用生成器將這些行組合在一起,並以一種便於在簡單 for 循環中使用的方式生成它們。 這可能會讓你開始:

def chunks_of(iterable, chunk_size=500):
    out = []
    for item in iterable:
        out.append(item)
        if len(out) >= chunk_size:
            yield out
            out = []
    if out:
        yield out

然后,您可以像這樣使用它:

for chunk_of_lines in chunks_of(file('/path/to/file'), chunk_size=500):
    # chunk_of_lines is 500 or fewer lines from the file

(為什么是“500 或更少”?因為如果文件中的行數不是 500 的偶數倍,最后一個塊可能不是 500 行。)

編輯:總是先檢查文檔。 這是來自itertools 文檔的食譜

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

這會在可迭代對象(在本例中為文件對象)上創建一個包含n 個迭代器的列表——因為它們都是同一底層 object 上的迭代器,當一個迭代器前進時,rest 也將全部前進——然后壓縮它們的結果. izip_longestizip一樣工作,但是用fillvalue它的結果,而不是像我的chunks_of function 那樣簡單地省略它們。

您還可以使用itertools.islice一次讀取 500 行:

lines = itertools.islice(file_obj, 500)

糾正我,但我認為這個非常基本的示例也可以工作:

linesToProceed = 500
with open(filename, 'r') as f:
    lines = []
    for i,line in enumerate(f):
        if (i + 1) % linesToProceed:
            # do something with lines in lines
            lines = []
        else:
            lines.append(line)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM