从Python中的打开文件中每100行(或更少)读取一次

时间:2015-04-08 19:39:48

标签: python

我有一个包含数千条记录的文件,每行一条。我需要阅读100,处理它们,读取另外100个,处理它们等等。我不想加载那些记录并将它们保存在内存中。如何使用Python从打开的文件读取(直到EOF)100或更少(当遇到EOF时)行?

5 个答案:

答案 0 :(得分:7)

islice()可用于检索迭代器的下一个n项。

from itertools import islice

with open(...) as file:
    while True:
        lines = list(islice(file, 100))
        for line in lines:
            # do stuff
        if not lines:
            break

答案 1 :(得分:2)

with open('file.txt', 'r') as f:
    workset = [] # start a work set
    for line in f: # iterate over file
        workset.append(line) # add current line to work set
        if len(workset) == 100: # if 100 items in work set,
            dostuff(workset) # send work set to processing
            workset = [] # make a new work set
    if workset: # if there's an unprocessed work set at the end (<100 items),
        dostuff(workset) # process it

答案 2 :(得分:1)

您可以在grouper recipe中使用i_zip_longest,这也可以解决您的EOF问题:

with open("my_big_file") as f:
    for chunk_100 in izip_longest(*[f] * 100)
          #record my lines

这里我们只是迭代我们的文件行,并指定我们的固定长度块为100行。

grouper食谱的简单示例(来自docs):

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

答案 3 :(得分:0)

使用itertools页面中的take食谱的可运行示例:

from itertools import islice

# Recipe from https://docs.python.org/2/library/itertools.html
def take(n, iterable):
    "Return first n items of the iterable as a list"
    return list(islice(iterable, n))

if __name__ == "__main__":
   with open('data.txt', 'r') as f:
     while True:
       lines = take(100, f)
       if lines:
         print(lines)
       else:
         break

答案 4 :(得分:0)

import numpy as np
from sklearn.manifold import TSNE
# flatten the X image array

X_embedded = TSNE(n_components=2).fit_transform(X)
X_embedded.shape

# apply, k-means to find suitable clusters

from sklearn.cluster import KMeans
import numpy as np

kmeans = KMeans(n_clusters=2, random_state=0).fit(X_embedded)
kmeans.labels_

# test images
kmeans.predict(X_test)

kmeans.cluster_centers_

# for each cluster center assign a new class

您可以使用内置的迭代器,而不是创建自己的迭代器。

python的方法file.readlines(sizehint=<line size in Bytes>) 返回文件中所有行的列表。 如果文件太大,将无法容纳在内存中。

因此,您可以使用参数sizehint。 它将从文件中读取file.readlines()字节(而不是行),并读取更多字节以完成一行,然后从该行返回行。 只有完整的行 将返回。

例如:

sizehint

它将从文件中读取1000字节。