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

关于使用pandas read_csv的skiprows读取大CSV末尾n行的效率问询

结论:使用skiprows会更慢,甚至大幅降低效率

核心原因

pandas.read_csv的skiprows参数并没有跳过文件读取的核心过程——它仍然需要从头扫描整个文件来计算总行数,再跳过前面的行。对于GB级的大文件来说,这和读取整个文件的IO开销几乎完全一样,完全没达到只取最后n行的优化目的。

高效替代方案

正确的思路是从文件末尾反向读取,避免全量扫描。下面是一个实用的实现示例,先通过Python内置IO操作获取最后n行,再交给pandas解析:

import pandas as pd

def read_last_n_lines(file_path, n=50):
    with open(file_path, 'rb') as f:
        # 从文件末尾开始反向查找换行符
        f.seek(-2, 2)
        lines_found = 0
        buffer = []
        while lines_found < n:
            try:
                f.seek(-2, 1)
            except OSError:
                # 到达文件开头,停止
                f.seek(0)
            char = f.read(1)
            if char == b'\n':
                lines_found += 1
                # 读取当前行(从当前位置到行尾)
                line = f.readline().decode('utf-8').strip()
                buffer.append(line)
                if lines_found == n:
                    break
        # 反转buffer,恢复原始顺序
        buffer.reverse()
        # 加上表头(如果CSV有表头)
        f.seek(0)
        header = f.readline().decode('utf-8').strip()
        # 拼接成CSV格式字符串,交给pandas解析
        csv_content = header + '\n' + '\n'.join(buffer)
        return pd.read_csv(pd.compat.StringIO(csv_content))

不同场景的效率差异

  • GB级大文件:skiprows的耗时几乎和读取整个文件一致,而反向读取的耗时仅取决于最后n行的大小,效率差距会非常显著。
  • MB级小文件:两种方式的差异可能不明显,但反向读取仍然更优,尤其是在数千个文件批量处理的场景下,累计节省的时间会很可观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:04:53