python - 如何循环访问同一打开文件的两个生成器

标签 python generator python-itertools

我有一个中等大小的文件(25MB,1000000 行),我想读取除每隔三行之外的每一行。

第一个问题:将整个文件加载到内存中然后读取行(方法 .read())或加载并读取一行是否更快?时间(方法.readline())?

由于我不是经验丰富的编码员,因此我尝试了使用 itertools 模块中的 islice 方法的第二个选项。

import intertools

with open(input_file) as inp:
    inp_atomtype = itertools.islice(inp, 0, 40, 3)
    inp_atomdata = itertools.islice(inp, 1, 40, 3)
    for atomtype, atomdata in itertools.zip_longest(inp_atomtype, inp_atomdata):
        print(atomtype + atomdata)

虽然循环遍历单个生成器(inp_atomtypeinp_atomdata)会打印正确的数据,但同时循环遍历它们(如本代码所示)会打印错误的数据。

第二个问题:如何使用生成器到达所需的行?

最佳答案

您不需要对迭代器进行切片,一个简单的行计数器就足够了:

with open(input_file) as f:
    current_line = 0
    for line in f:
        current_line += 1
        if current_line % 3:  # ignore every third line
            print(line)  # NOTE: print() will add an additional new line by default

至于将其变成生成器,只需yield该行而不是打印。

说到速度,考虑到您无论如何都会读取行,I/O 部分可能会采取相同的方式,但您可能会从快速列表切片而不是计数行中受益一点(在总处理时间中),如果您有足够的工作内存来保存文件内容,并且如果可以接受预先加载整个文件而不是

关于python - 如何循环访问同一打开文件的两个生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52438356/

相关文章:

python-3.x - 基于不变式/散列的拆分/分区列表?

python - 字典的键在添加时顺序不对?

python - tkinter Entry 小部件中的可见文本变量

python - C++ 中的递归生成器

Python:获取二进制排列,但控制循环流

python - 如何按总和的顺序遍历大量整数元组?

python - 从 SQL Server 数据库中获取表列表作为一个干净的 python 字符串列表

python - 不允许执行 Sudo pip install 升级操作

python - 控制嵌套列表/字符串的递归

python - Django 查询集和生成器