繁体   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