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