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

