如何用Python将多日数据写入单个CSV文件而非多个文件
我来帮你搞定这个问题!你现在的核心问题其实不是追加模式或者关闭文件的锅——你每次循环都在创建带日期后缀的新文件,哪怕用了"a"模式,也只是往当天的那个独立文件里加内容,根本没写到同一个目标文件里呀!
解决方案思路
要实现「所有日期数据写入同一文件+仅一份表头」,关键要做这几点:
- 把文件打开操作移到循环外面,确保整个过程都往同一个文件写入
- 只在最开始写入一次表头,避免重复
- 用
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} 没有返回有效的赛事数据")
关键改动说明
- 固定文件名:不再用
the_date拼接文件名,改用Test_all_dates.csv,确保所有数据都写入同一个文件 - 文件打开移到循环外:
with语句会保持文件打开状态,直到循环结束自动关闭,避免重复打开/关闭的问题 - 表头仅写一次:在循环开始前就写入表头,彻底解决重复表头的问题
- 优化URL拼接:用f-string替代字符串相加,代码更易读维护
- 增加异常处理:防止某天API返回数据缺失
games字段,导致脚本直接崩溃
为什么之前的做法没用?
你之前的代码里,每次循环都会生成一个带日期的新文件名(比如Test_between_dates20180329.csv),哪怕用了"a"模式,也只是往当天的那个文件追加内容,和其他日期的文件完全无关。注释掉outfile.close()也解决不了这个核心问题——毕竟文件本身就不是同一个呀!
内容的提问来源于stack exchange,提问作者Michael T Johnson
相关产品推荐
相关产品推荐

