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

如何用Python将多日数据写入单个CSV文件而非多个文件

我来帮你搞定这个问题!你现在的核心问题其实不是追加模式或者关闭文件的锅——你每次循环都在创建带日期后缀的新文件,哪怕用了"a"模式,也只是往当天的那个独立文件里加内容,根本没写到同一个目标文件里呀!

解决方案思路

要实现「所有日期数据写入同一文件+仅一份表头」,关键要做这几点:

  1. 把文件打开操作移到循环外面,确保整个过程都往同一个文件写入
  2. 只在最开始写入一次表头,避免重复
  3. 用with语句管理文件,自动处理关闭,不用手动纠结close()

修改后的完整代码

import csv
import requests
import datetime
from pprint import pprint
import pendulum

start = pendulum.datetime(2018, 3, 29)
end = pendulum.today()
period = pendulum.period(start, end)

# 用with语句打开固定文件名的文件,自动处理关闭
with open('Test_all_dates.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)
    # 只写入一次表头
    writer.writerow(["time", "status"])
    
    for dt in period.range('days'):
        the_date = dt.format('YYYYMMDD')
        # 用f-string拼接URL更简洁清晰
        req2 = requests.get(f'https://api-prod.sprtactn.co/web/v1/scoreboard/mlb?bookIds=21,1,55&date={the_date}')
        
        # 加个异常处理,防止某天API返回数据结构异常导致脚本崩溃
        try:
            odd = req2.json()['games']
            for info in odd:
                time = info['start_time']
                status = info['status']
                print(time, status)
                writer.writerow([time, status])
        except KeyError:
            print(f"⚠️ 日期 {the_date} 没有返回有效的赛事数据")

关键改动说明

  1. 固定文件名:不再用the_date拼接文件名,改用Test_all_dates.csv,确保所有数据都写入同一个文件
  2. 文件打开移到循环外:with语句会保持文件打开状态,直到循环结束自动关闭,避免重复打开/关闭的问题
  3. 表头仅写一次:在循环开始前就写入表头,彻底解决重复表头的问题
  4. 优化URL拼接:用f-string替代字符串相加,代码更易读维护
  5. 增加异常处理:防止某天API返回数据缺失games字段,导致脚本直接崩溃

为什么之前的做法没用?

你之前的代码里,每次循环都会生成一个带日期的新文件名(比如Test_between_dates20180329.csv),哪怕用了"a"模式,也只是往当天的那个文件追加内容,和其他日期的文件完全无关。注释掉outfile.close()也解决不了这个核心问题——毕竟文件本身就不是同一个呀!

内容的提问来源于stack exchange,提问作者Michael T Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:11