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

Python爬虫持续保存赛事数据时如何避免CSV重复写入及优化存储?

去重逻辑错误点
  • 遍历判断逻辑错误:你在遍历CSV行的循环中,只要遇到第一行不匹配就直接写入数据并跳出循环,没有遍历完所有行判断是否存在匹配项,只要CSV第一行不是当前赛事就会触发重复写入。
  • 分支逻辑遗漏:匹配到已存在赛事时仅执行pass,没有设置跳过写入的标识,后续逻辑依然会执行写入相关操作。
  • 资源操作冲突:在读取CSV的with块内再次打开同一个CSV文件写入,同名变量覆盖会导致读取流异常,且不需要手动调用close(),with上下文会自动释放文件资源。
  • 变量名错误:代码中写入时用的date_01变量和你定义的data变量名不统一,可能导致写入字段错位。
修复后的CSV去重实现

正确逻辑是先一次性读取所有已存在赛事的hour+race唯一组合存入集合,再判断当前赛事是否在集合内,不在才执行写入:

import csv
import os

# 初始化CSV,不存在则写入表头
if not os.path.exists('output_races.csv'):
    with open('output_races.csv', 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(['Date','Hour','Race','Country','Money','Against_odds','Jokey'])

loop_count = 0
while loop_count < 10:
    # 此处替换为你实际爬虫抓取的赛事数据
    date_01 = '26 Aug'
    hour = '07:34'
    race = "['Moci']"
    country = '(RO)'
    money = '7807'
    against_odds = '2.1'
    jokey = 'Dude\nGeorge'

    # 读取所有已存在的唯一赛事标识
    existed_races = set()
    with open('output_races.csv', 'r', newline='', encoding='utf-8') as f:
        reader = csv.reader(f)
        next(reader) # 跳过表头
        for row in reader:
            if len(row) >= 3:
                existed_races.add((row[1], row[2]))
    
    # 仅未存在的赛事才写入
    current_key = (hour, race)
    if current_key not in existed_races:
        with open('output_races.csv', 'a', newline='', encoding='utf-8') as f:
            writer = csv.writer(f)
            writer.writerow([date_01, hour, race, country, money, against_odds, jokey])
    
    loop_count += 1
更适合的流式存储替代方案

CSV只适合静态小数据存储,持续循环读写的场景推荐使用以下方案:

  • 嵌入式数据库SQLite:无需额外部署服务,支持SQL查询,可给hour、race字段加索引,存在性判断性能远高于全量读CSV,还支持事务和并发控制,避免写入冲突。
  • 键值数据库Redis:直接将hour+race作为key存储,存在性判断时间复杂度为O(1),性能极高,还可设置过期时间自动清理已结束的赛事数据,无需手动维护历史数据。
  • JSON Lines格式:每行存储一个赛事的JSON对象,比CSV更适配带换行、特殊符号的字段(比如你的jokey字段含换行符),解析时不易出现格式错位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:18:03