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

如何用Pandas持续读取不断增长的CSV文件?

逐行读取持续增长CSV文件的实用方案

你用pandas chunksize迭代器的问题在于,一旦迭代到文件末尾就会触发StopIteration终止循环,没法感知后续新增的内容。下面给两种靠谱的解决思路:

方法1:用原生文件+csv模块跟踪读取位置

直接用Python内置的文件操作和csv模块,核心是记录每次读完后的文件位置,循环检查新增内容,不会重复读取旧行:

import csv
import time

def follow_csv(file_path):
    with open(file_path, 'r', newline='') as f:
        # 先读取表头(如果你的CSV没有表头,直接用csv.reader即可)
        reader = csv.DictReader(f)
        print(f"表头字段: {reader.fieldnames}")
        
        last_read_pos = f.tell()
        while True:
            # 回到上次读取结束的位置
            f.seek(last_read_pos)
            # 读取新增的每一行
            for row in reader:
                do_something(row)
                # 更新读取位置
                last_read_pos = f.tell()
            # 暂停一段时间再检查文件更新
            time.sleep(0.1)

def do_something(row):
    # 替换成你自己的业务处理逻辑
    print(f"处理行: {row}")

follow_csv('file.csv')

这个方法轻量且稳定,适合大多数追加式更新的CSV场景。

方法2:改进pandas读取逻辑(保留pandas处理能力)

如果必须用pandas处理数据,可以通过记录已读行数,每次跳过已读内容,捕获迭代终止的情况后循环重试:

import pandas as pd
import time

def follow_csv_with_pandas(file_path):
    # 先获取CSV的表头信息
    header_names = pd.read_csv(file_path, nrows=0).columns
    header_row_count = 1  # 默认表头占1行
    read_data_row_count = 0  # 记录已处理的数据行数(不含表头)

    while True:
        try:
            # 跳过表头+已读数据行,读取新增内容,指定列名避免表头重复
            chunk_iter = pd.read_csv(
                file_path,
                skiprows=header_row_count + read_data_row_count,
                chunksize=1,
                header=None,
                names=header_names
            )
            for chunk in chunk_iter:
                do_something(chunk)
                read_data_row_count += len(chunk)
            # 读完当前所有行后,等待再检查
            time.sleep(0.1)
        except Exception:
            # 处理文件锁定、临时读取失败等异常,重试
            time.sleep(0.1)
            continue

def do_something(chunk):
    # 替换成你的pandas数据处理逻辑
    print(f"处理数据块:\n{chunk}")

follow_csv_with_pandas('file.csv')

额外注意事项

  • 如果CSV文件存在被重写(不是追加)的情况,需要额外判断文件大小变化:当文件大小突然小于上次记录的大小,说明文件被重置,要重置读取位置从头开始读。
  • 写入CSV的程序可能会锁定文件,读取时要做好异常捕获和重试逻辑,避免程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:27:43