如何结合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')
代码说明:
- 文件资源管理:用
with语句自动处理文件的打开与关闭,避免资源泄漏问题。 - 交替读取逻辑:外层循环持续执行,直到两个文件的内容都读取完毕。每次先读取
file1的3行,再读取file2的4行。 - 要求函数的实际应用:
tell():读取前记录当前文件指针的位置,用于后续seek()验证读取内容的一致性。seek():将指针移回之前记录的位置,用另一种读取方式(next()/readline())交叉验证内容,展示该函数的精准定位能力。readline():逐行读取文件内容,返回空字符串时表示文件已到末尾。next():把文件对象当作迭代器使用,获取下一行内容,通过next(f, None)的写法避免文件末尾时抛出StopIteration异常。
- 终止条件判断:通过
seek(0, 2)移动到文件末尾获取末尾位置,对比当前指针位置,判断是否两个文件都已读取完毕。
运行这段代码后,输出顺序会完全符合你的要求:先输出file1的前3行,再输出file2的前4行,接着继续读取file1的下3行、file2的下4行,直到所有内容读取完毕。
内容的提问来源于stack exchange,提问作者Mas A
相关产品推荐
相关产品推荐

