如何用Python函数批量下载CSV文件中的GitHub公开仓库
批量下载GitHub公开仓库到本地(Python实现)
完整代码实现
以下是整合了CSV读取与仓库批量下载的完整代码:
import csv import requests import zipfile import os from io import BytesIO def download_github_repo(repo_path, save_dir="downloaded_repos"): # 构造仓库默认分支(main)的zip下载链接 repo_url = f"https://github.com/{repo_path}/archive/refs/heads/main.zip" # 创建根保存目录,已存在则跳过 os.makedirs(save_dir, exist_ok=True) try: # 流式下载zip包,降低内存占用 response = requests.get(repo_url, stream=True) response.raise_for_status() # 触发HTTP请求错误 # 读取zip内容并解压 with BytesIO(response.content) as zip_buffer: with zipfile.ZipFile(zip_buffer, 'r') as zip_ref: # 每个仓库单独存放在以仓库路径命名的子目录中 target_dir = os.path.join(save_dir, repo_path) zip_ref.extractall(target_dir) print(f"✅ 完成下载: {repo_path}") except requests.exceptions.RequestException as e: print(f"❌ 下载失败 {repo_path}: {str(e)}") except zipfile.BadZipFile: print(f"❌ 无效zip包 {repo_path}: 可能仓库不存在或默认分支不是main") # 读取CSV获取Java仓库列表 file_name = "dataset.csv" java_repos = [] # 用with语句自动管理文件句柄,避免资源泄漏 with open(file_name, 'r', newline='', encoding='utf-8') as f: csv_reader = csv.reader(f) # 如果CSV有表头,取消下面一行的注释跳过表头 # next(csv_reader) for row in csv_reader: # 检查列数足够且第二列为Java,避免索引越界 if len(row) >= 2 and row[1].strip() == "Java": repo_path = row[0].strip() if repo_path: # 跳过空的仓库地址 java_repos.append(repo_path) print(f"🔍 找到仓库: {repo_path}") # 执行批量下载 for repo in java_repos: download_github_repo(repo)
关键细节说明
- 分支适配:代码默认使用
main分支,如果你的目标仓库默认分支是master,请将链接中的refs/heads/main替换为refs/heads/master。 - 目录结构:所有仓库会被下载到
downloaded_repos目录下,每个仓库单独存放在以用户名/仓库名命名的子文件夹中,避免文件冲突。 - 错误处理:单个仓库下载失败不会中断整个批量任务,会打印错误信息继续处理下一个仓库。
- CSV读取优化:添加了编码设置、空值过滤和列数检查,避免因CSV格式问题导致程序崩溃。
内容的提问来源于stack exchange,提问作者Z Bokaee
相关产品推荐
相关产品推荐

