如何在pandas read_csv读取至文件末尾后重新从头读取且保证性能?
解决方案:无需反复打开关闭文件实现重复读取
方法1:复用已打开的文件对象(适合大文件)
直接先打开文件,每次读取前将文件指针移到开头,再创建pandas的分块读取器。这样文件只打开一次,避免反复IO开销:
import pandas as pd with open("myfile.csv", "r") as f: # 示例:循环读取3次,可根据需求替换为自定义终止条件 for _ in range(3): f.seek(0) # 将文件指针移回文件开头 reader = pd.read_csv(f, chunksize=10**6) for chunk in reader: for _, row in chunk.iterrows(): do_something(row)
方法2:将文件加载到内存复用(适合小/中等文件)
如果文件大小在内存承受范围内,一次性把文件内容读到内存,用io.StringIO模拟文件对象,之后每次读取前重置指针即可,性能比直接操作磁盘文件更快:
import pandas as pd import io # 一次性读取文件内容到内存 with open("myfile.csv", "r") as f: csv_data = f.read() # 用StringIO包装成可重复操作的"文件" csv_io = io.StringIO(csv_data) while True: csv_io.seek(0) # 重置到开头 reader = pd.read_csv(csv_io, chunksize=10**6) for chunk in reader: for _, row in chunk.iterrows(): do_something(row) # 记得添加终止循环的条件,比如判断某个标志位或循环次数
额外优化建议
- 避免使用
iterrows():它的遍历效率很低,如果你的do_something可以用pandas的向量化操作实现(比如chunk.apply(do_something, axis=1)或者直接对列进行运算),能大幅提升处理速度。 - 若需无限循环读取,务必添加退出逻辑,比如捕获外部信号或设置循环次数,防止死循环。
内容的提问来源于stack exchange,提问作者Wai
相关产品推荐
相关产品推荐

