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

如何用Python将GitHub数据集直接上传至S3而无需本地存储

直接将GitHub公开数据集上传至S3(无需本地存储)

实现思路

核心是利用流式传输:通过HTTP请求获取GitHub文件的原始字节流,直接传递给boto3的upload_fileobj方法,全程不落地存储文件。

前提准备

  • 安装依赖包:pip install boto3 requests
  • 配置AWS凭证:可通过环境变量、~/.aws/credentials文件或IAM角色(在AWS服务上运行时)配置
  • 获取GitHub文件的原始URL:进入GitHub仓库的文件页面,点击「Raw」按钮复制对应URL(例如statsbomb的events文件原始URL格式为https://raw.githubusercontent.com/statsbomb/open-data/master/data/events/1.json)

单文件上传代码

import boto3
import requests

def upload_github_file_to_s3(github_raw_url, s3_bucket, s3_key):
    # 初始化S3客户端
    s3_client = boto3.client('s3')
    
    # 流式获取GitHub文件内容并直接上传
    with requests.get(github_raw_url, stream=True) as r:
        r.raise_for_status()
        s3_client.upload_fileobj(r.raw, s3_bucket, s3_key)
        print(f"文件已上传至S3:s3://{s3_bucket}/{s3_key}")

# 示例使用
if __name__ == "__main__":
    GITHUB_RAW_URL = "https://raw.githubusercontent.com/statsbomb/open-data/master/data/events/1.json"
    S3_BUCKET = "your-bucket-name"
    S3_KEY = "statsbomb/events/1.json"
    
    upload_github_file_to_s3(GITHUB_RAW_URL, S3_BUCKET, S3_KEY)

批量目录上传代码

如果需要上传整个GitHub目录下的文件,可先解析目录页面获取所有文件的原始URL,再批量上传:

import boto3
import requests
from bs4 import BeautifulSoup  # 需安装:pip install beautifulsoup4

def get_github_dir_file_urls(github_dir_url):
    # 从GitHub目录页面提取所有文件的原始URL
    file_urls = []
    r = requests.get(github_dir_url)
    r.raise_for_status()
    soup = BeautifulSoup(r.text, 'html.parser')
    
    for link in soup.find_all('a', class_='js-navigation-open Link--primary'):
        href = link.get('href')
        if not href.endswith('/'):  # 排除目录链接
            raw_url = f"https://raw.githubusercontent.com{href.replace('/blob/', '/')}"
            file_urls.append(raw_url)
    return file_urls

def batch_upload_github_dir_to_s3(github_dir_url, s3_bucket, s3_prefix):
    file_urls = get_github_dir_file_urls(github_dir_url)
    s3_client = boto3.client('s3')
    
    for url in file_urls:
        filename = url.split('/')[-1]
        s3_key = f"{s3_prefix}/{filename}"
        
        with requests.get(url, stream=True) as r:
            r.raise_for_status()
            s3_client.upload_fileobj(r.raw, s3_bucket, s3_key)
            print(f"已完成上传:{s3_key}")

# 示例:批量上传events目录文件
if __name__ == "__main__":
    GITHUB_DIR_URL = "https://github.com/statsbomb/open-data/tree/master/data/events"
    S3_BUCKET = "your-bucket-name"
    S3_PREFIX = "statsbomb/events"
    
    batch_upload_github_dir_to_s3(GITHUB_DIR_URL, S3_BUCKET, S3_PREFIX)

注意事项

  • 大文件适配:stream=True确保不会将整个文件加载到内存,适合处理大体积数据集
  • 错误处理:可添加try-except块捕获网络或S3上传错误,实现重试逻辑
  • GitHub限制:批量上传大量文件时,建议改用GitHub API获取文件列表,避免网页解析被反爬限制,同时遵守API请求速率限制
  • AWS权限:确保S3客户端拥有s3:PutObject权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:10:55