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

