关于使用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
相关产品推荐
相关产品推荐

