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

Web爬虫写入CSV反复覆盖同一行,求故障原因

解决CSV写入时重复覆盖第一行的问题

嘿,这个问题我太熟了!你遇到的重复覆盖第一行的情况,几乎可以肯定是因为每次写入数据时都在循环里重新打开了CSV文件,而且用了'w'模式——这个模式会直接清空文件内容再从头写,所以每循环一次就把之前的内容冲掉,最后看起来就像所有数据都挤在第一行(其实是每次都覆盖第一行)。

核心解决方案:把文件打开操作放在循环外面

不管用csv.writer还是csv.DictWriter,正确的姿势都是在循环外部打开文件,这样文件只会被初始化一次,后续的写入都是追加到文件末尾。

用csv.writer的正确写法

import csv
from datetime import date

def create_csv_file(data_list):  # data_list是你的100条爬取数据的列表
    file_name = f"{date.today()}.csv"
    field_names = ['Rank', 'Title', 'Author']  # 替换成你的实际字段
    
    # 循环外打开文件,'w'模式只执行一次,自动创建/清空文件
    with open(file_name, 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        # 先写入表头
        writer.writerow(field_names)
        # 循环写入每一条数据
        for data in data_list:
            # 这里要确保数据顺序和表头对应
            writer.writerow([data['Rank'], data['Title'], data['Author']])

用csv.DictWriter的正确写法

如果你的爬取数据是字典格式,用DictWriter会更省心,不需要手动对应顺序:

import csv
from datetime import date

def create_csv_file(data_list):
    file_name = f"{date.today()}.csv"
    field_names = ['Rank', 'Title', 'Author']  # 要和字典的键完全对应
    
    with open(file_name, 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=field_names)
        # 写入表头
        writer.writeheader()
        # 循环写入每条字典数据
        for data in data_list:
            writer.writerow(data)

特殊情况:如果必须在循环内打开文件(不推荐)

要是因为某些原因不得不把open()放在循环里,那就要用'a'(追加)模式,并且要确保表头只写一次:

import csv
import os
from datetime import date

def create_csv_file(data_list):
    file_name = f"{date.today()}.csv"
    field_names = ['Rank', 'Title', 'Author']
    # 检查文件是否已存在,避免重复写表头
    file_exists = os.path.isfile(file_name)
    
    for data in data_list:
        with open(file_name, 'a', newline='', encoding='utf-8') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=field_names)
            if not file_exists:
                writer.writeheader()
                file_exists = True  # 写完表头后标记为已存在,后续循环不再写
            writer.writerow(data)

简单总结下:你之前的代码应该是把文件打开的逻辑放进了循环体里,导致每次循环都重新创建文件、清空内容。把open()移到循环外面,问题就能解决啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:23:04