如何批量拉取指定GitHub仓库中的所有CSV文件并合并为单个CSV文件
一次性加载并合并目标仓库所有CSV文件的实现方案
核心思路:先获取目标目录下所有.csv格式的文件名称,遍历拼接raw资源地址加载为DataFrame,为每个表新增对应日期字段以区分数据所属日期,最后合并所有表得到全量数据集即可。
方法1:自动拉取目录下所有CSV(无需手动指定日期范围)
import pandas as pd import requests # 目标目录的GitHub API地址,用于获取文件列表 api_url = "https://api.github.com/repos/CSSEGISandData/COVID-19/contents/csse_covid_19_data/csse_covid_19_daily_reports" raw_base_url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/" # 请求文件列表 res = requests.get(api_url) file_list = res.json() df_list = [] for file in file_list: # 只处理csv后缀的文件 if file["name"].endswith(".csv"): # 提取日期(文件名格式为MM-DD-YYYY.csv) date_str = file["name"].replace(".csv", "") # 拼接raw地址加载csv file_url = raw_base_url + file["name"] tmp_df = pd.read_csv(file_url) # 新增日期列,方便后续区分数据所属日期 tmp_df["report_date"] = date_str df_list.append(tmp_df) # 合并所有数据 total_df = pd.concat(df_list, ignore_index=True) # 导出到本地csv,方便后续数据清洗使用 total_df.to_csv("covid_daily_total.csv", index=False, encoding="utf-8-sig") # 查看合并后的数据 print(total_df.shape) total_df.head()
方法2:按指定日期范围拉取(无需调用GitHub API)
如果你只需要某段时间的数据,可以直接构造对应日期的文件名,避免调用API的请求限制问题:
import pandas as pd from datetime import datetime, timedelta raw_base_url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/" # 自定义起止日期,示例为2021年1月1日到2021年1月31日 start_date = datetime(2021,1,1) end_date = datetime(2021,1,31) df_list = [] current_date = start_date while current_date <= end_date: # 构造MM-DD-YYYY格式的文件名 date_str = current_date.strftime("%m-%d-%Y") file_url = raw_base_url + date_str + ".csv" try: tmp_df = pd.read_csv(file_url) tmp_df["report_date"] = date_str df_list.append(tmp_df) except: # 跳过不存在的日期文件 print(f"{date_str} 无对应日报数据,已跳过") current_date += timedelta(days=1) total_df = pd.concat(df_list, ignore_index=True) total_df.to_csv("covid_daily_custom.csv", index=False, encoding="utf-8-sig")
注意事项
- 不同时期的日报字段名存在差异(例:早期
Country/Region后期改为Country_Region),pandas的concat方法会自动对齐列,缺失字段自动填充NaN,无需额外手动处理 - 批量加载时如果出现网络报错,可以适当增加请求间隔,或者调整try-except逻辑重试失败的文件
- 全量数据量较大,建议导出为本地文件后再做数据清洗,避免重复请求消耗网络资源
内容的提问来源于stack exchange,提问作者Syeda
相关产品推荐
相关产品推荐

