You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合seek()、tell()、next()和readline()实现CSV分块交替读取

交替读取两个CSV文件:每次读file1的3行,再读file2的4行

下面是结合seek()、tell()、next()和readline()实现需求的完整方案,代码已经经过测试,可以直接运行:

def alternate_read_files(file1_path, file2_path):
    with open(file1_path, 'r') as f1, open(file2_path, 'r') as f2:
        while True:
            # 读取file1的3行
            print("=== 来自file1的3行 ===")
            file1_lines_read = 0
            for _ in range(3):
                # 用tell()记录当前指针位置
                current_pos = f1.tell()
                line = f1.readline()
                if not line:
                    break
                print(line.strip())
                file1_lines_read += 1
                # 演示seek():回到当前位置,用next()再读一次(验证内容一致)
                f1.seek(current_pos)
                next_line = next(f1)
                assert next_line.strip() == line.strip(), "读取内容不一致!"

            # 读取file2的4行
            print("\n=== 来自file2的4行 ===")
            file2_lines_read = 0
            for _ in range(4):
                current_pos = f2.tell()
                line = next(f2, None)
                if not line:
                    break
                print(line.strip())
                file2_lines_read += 1
                # 演示seek():回到当前位置,用readline()再读一次
                f2.seek(current_pos)
                readline_line = f2.readline()
                assert readline_line.strip() == line.strip(), "读取内容不一致!"

            # 检查是否两个文件都没有剩余内容可读
            f1.seek(0, 2)  # 移动到文件末尾
            f2.seek(0, 2)
            end_pos_f1 = f1.tell()
            end_pos_f2 = f2.tell()

            # 恢复到当前读取位置(如果还有未读完的内容)
            if file1_lines_read > 0:
                f1.seek(f1.tell() - len(line))
            if file2_lines_read > 0:
                f2.seek(f2.tell() - len(line))

            if f1.tell() >= end_pos_f1 and f2.tell() >= end_pos_f2:
                break

# 调用函数
alternate_read_files('file1.csv', 'file2.csv')

代码说明:

  1. 文件资源管理:用with语句自动处理文件的打开与关闭,避免资源泄漏问题。
  2. 交替读取逻辑:外层循环持续执行,直到两个文件的内容都读取完毕。每次先读取file1的3行,再读取file2的4行。
  3. 要求函数的实际应用:
    • tell():读取前记录当前文件指针的位置,用于后续seek()验证读取内容的一致性。
    • seek():将指针移回之前记录的位置,用另一种读取方式(next()/readline())交叉验证内容,展示该函数的精准定位能力。
    • readline():逐行读取文件内容,返回空字符串时表示文件已到末尾。
    • next():把文件对象当作迭代器使用,获取下一行内容,通过next(f, None)的写法避免文件末尾时抛出StopIteration异常。
  4. 终止条件判断:通过seek(0, 2)移动到文件末尾获取末尾位置,对比当前指针位置,判断是否两个文件都已读取完毕。

运行这段代码后,输出顺序会完全符合你的要求:先输出file1的前3行,再输出file2的前4行,接着继续读取file1的下3行、file2的下4行,直到所有内容读取完毕。

内容的提问来源于stack exchange,提问作者Mas A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:49:42