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

如何读取CSV文件最后20行到Pandas DataFrame并计算总行数

解决方案:读取多个CSV的最后20行到Pandas DataFrame

要实现你的需求,关键是高效计算每个CSV的总行数,同时要注意保留表头(避免跳过表头导致列名丢失)。下面分两种场景给出具体实现:

方法1:纯Python实现(跨平台)

这种方法不依赖外部命令,适合所有操作系统。核心思路是先快速统计文件总行数,再根据总行数决定需要跳过的行(注意避开表头)。

步骤:

  1. 写一个高效的行计数函数:直接遍历文件行,比用Pandas全量读取后再计数快得多,尤其是大文件。
  2. 对每个CSV文件,判断总行数是否超过20:
    • 如果≤20:直接全量读取
    • 如果>20:跳过表头之外的前总行数-20行,保留表头和最后20条数据

代码实现:

import glob
import pandas as pd

def count_csv_total_lines(file_path):
    """统计CSV文件的总行数(包括表头)"""
    with open(file_path, 'r', encoding='utf-8') as f:
        return sum(1 for line in f)

# 遍历所有CSV文件,读取最后20行
log_total = []
for csv_file in glob.glob('./coins/*.csv'):
    total_lines = count_csv_total_lines(csv_file)
    
    if total_lines <= 20:
        # 文件内容不足20行,直接全读
        df = pd.read_csv(csv_file)
    else:
        # 跳过表头(索引0)之后的前N行,保留表头和最后20条数据
        # 要跳过的行是索引1到total_lines-21,对应range(1, total_lines-20)
        df = pd.read_csv(csv_file, skiprows=range(1, total_lines - 20))
    
    log_total.append(df)

# 可选:将所有DataFrame合并为一个
combined_df = pd.concat(log_total, ignore_index=True)

方法2:用系统命令加速(Linux/macOS/WSL)

如果你的运行环境支持tail命令(类Unix系统),可以直接用它读取文件最后20行,无需统计总行数,速度更快(尤其超大型文件)。

步骤:

  1. 先读取CSV的表头
  2. 用tail -n 20读取文件最后20行
  3. 如果表头不在这20行里,就把表头和读取到的内容合并,再用Pandas解析

代码实现:

import glob
import pandas as pd
import subprocess
from io import StringIO

def read_csv_last_n_lines(file_path, n=20):
    """读取CSV文件的最后n行(保留表头)"""
    # 读取表头
    with open(file_path, 'r', encoding='utf-8') as f:
        header = f.readline().strip()
    
    # 用tail命令读取最后n行
    result = subprocess.run(
        ['tail', '-n', str(n), file_path],
        capture_output=True,
        text=True,
        encoding='utf-8'
    )
    last_lines = result.stdout
    
    # 如果表头不在最后n行中,手动添加表头
    if not last_lines.startswith(header):
        last_lines = f"{header}\n{last_lines}"
    
    # 用StringIO将字符串转为可读取的文件对象
    return pd.read_csv(StringIO(last_lines))

# 遍历文件并收集结果
log_total = [read_csv_last_n_lines(f) for f in glob.glob('./coins/*.csv')]
combined_df = pd.concat(log_total, ignore_index=True)

关键细节说明:

  • 表头处理:两种方法都特意保留了CSV的表头,避免DataFrame出现列名错误的问题。
  • 边界情况:当文件总行数≤20时,直接全量读取,不会丢失任何数据。
  • 性能差异:方法2用系统命令直接读取文件末尾,比纯Python遍历行计数更快,适合处理超大CSV文件;方法1跨平台性更好,无需依赖外部命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:00:24