用python在生成器中分离奇偶行

2024-10-05 10:57:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的数据文件(~2G),需要拆分成奇数行和偶数行,分别处理并写入两个文件,我不想将整个文件读入RAM,所以我认为生成器应该是一个合适的选择。简而言之,我想做这样的事情:

lines = (l.strip() for l in open(inputfn))
oddlines = somefunction(getodds(lines))
evenlines = somefunction(getevens(lines))
outodds.write(oddlines)
outevens.write(evenlines)

这可能吗?显然,索引将不起作用:

^{pr2}$

Tags: 文件infor数据文件open事情writeram
3条回答
def oddlines(fileobj):
    return (line for index,line in enumerate(fileobj) if index % 2)

def evenlines(fileobj):
    return (line for index,line in enumerate(fileobj) if not index % 2)

请注意,这将需要扫描文件两次,因为这些文件不是设计为并行运行的。但是,它确实导致了更简单的代码。(另请注意,这里的“奇数”行是索引为1、3、5的行,这意味着由于索引为零,第一行是“偶数”行。)

正如Ashwini所说,您也可以使用itertools.islice来完成这项工作。在

使用itertools.islice分割迭代器:

from itertools import islice
with open('filename') as f1, open('evens.txt', 'w') as f2:
    for line in islice(f1, 0, None, 2):
        f2.write(line)

with open('filename') as f1, open('odds.txt', 'w') as f2:
    for line in islice(f1, 1, None, 2):
        f2.write(line)

如果只想读取文件一次,请编写一个生成器,它包装file,并返回一个标志,指示该行与从文件中读取的实际行是偶数还是奇数。在

def oddeven(f, even=True):
    for line in f:
        yield even, line
        even = not even

用法:

^{pr2}$

这可以通过将输出文件对象存储在可索引容器中来进一步简化:

^{3}$

相关问题 更多 >

    热门问题