如何用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
相关产品推荐
相关产品推荐

