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

