如何用Python检查GitHub仓库文件是否存在?无需下载大文件
用Python列出GitHub仓库目录的优雅方案(无需下载文件或解析HTML)
当然可以!解析HTML确实是个不太可靠的办法——GitHub页面结构随时可能变,维护起来太麻烦。其实GitHub官方提供了REST API和GraphQL API,这才是更优雅、稳定的方式,完全不需要下载仓库内容,甚至不用碰网页解析。下面给你两种实用的实现方式,还会帮你解决可能的安装问题:
方法一:使用GitHub REST API(简单易上手)
REST API是最直接的方式,对于公开仓库甚至不需要认证(私有仓库需要生成一个个人访问token),可以直接获取指定目录下的所有文件和文件夹信息。
代码示例
首先确保你安装了requests库,如果之前安装失败,试试国内镜像源:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
然后用以下代码检查文件是否存在:
import requests def check_file_in_github(repo_owner, repo_name, target_file, path=""): # 构造API请求URL url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/contents/{path}" response = requests.get(url) if response.status_code != 200: print(f"请求失败:{response.json().get('message', '未知错误')}") return False # 遍历目录下的所有项 for item in response.json(): if item["name"] == target_file: print(f"找到目标文件:{item['html_url']}") # 如果需要查看文件大小(比如判断是否是大文件) print(f"文件大小:{item['size'] / 1024 / 1024:.2f} MB") return True # 如果是文件夹,递归检查(可选,根据你的需求) if item["type"] == "dir": if check_file_in_github(repo_owner, repo_name, target_file, item["path"]): return True return False # 示例:检查tensorflow/tensorflow仓库根目录下是否有README.md if check_file_in_github("tensorflow", "tensorflow", "README.md"): print("文件存在!") else: print("文件不存在。")
说明
- 这个方法会递归遍历目录(如果需要的话),你可以根据需求关闭递归,只检查指定路径
- 私有仓库需要在请求头里添加
Authorization: token YOUR_TOKEN,token可以在GitHub的Settings -> Developer settings里生成 - API有速率限制,匿名请求每小时60次,认证后每小时5000次,完全够用日常检查
方法二:使用GitHub GraphQL API(更灵活高效)
如果你需要更精准的查询(比如直接筛选大文件,或者只获取特定字段),GraphQL API会更高效——它只返回你需要的数据,减少网络传输量。
代码示例
同样先确保requests安装成功,然后:
import requests def check_large_file_in_github(repo_owner, repo_name, target_file, min_size_mb=100): # GraphQL查询语句,只获取需要的字段 query = f""" query {{ repository(owner: "{repo_owner}", name: "{repo_name}") {{ object(expression: "HEAD:") {{ ... on Tree {{ entries {{ name type object {{ ... on Blob {{ size }} }} }} }} }} }} }} """ # 私有仓库需要替换成你的token,公开仓库可以暂时留空,但速率限制很严 headers = {"Authorization": "token YOUR_TOKEN"} response = requests.post("https://api.github.com/graphql", json={"query": query}, headers=headers) if response.status_code != 200: print(f"请求失败:{response.json().get('message', '未知错误')}") return False data = response.json() entries = data["data"]["repository"]["object"]["entries"] for entry in entries: if entry["name"] == target_file and entry["type"] == "blob": file_size_mb = entry["object"]["size"] / 1024 / 1024 if file_size_mb >= min_size_mb: print(f"找到目标大文件:{entry['name']},大小:{file_size_mb:.2f} MB") return True else: print(f"找到文件,但大小不足{min_size_mb} MB") return True return False # 示例:检查pytorch/pytorch仓库根目录下是否有大于100MB的LICENSE文件 if check_large_file_in_github("pytorch", "pytorch", "LICENSE"): print("符合条件的文件存在!") else: print("文件不存在或大小不达标。")
说明
- GraphQL的优势是可以自定义返回字段,比如你只需要文件名和大小,就不会返回多余的内容
- 同样,私有仓库必须用token,公开仓库建议用token来提升速率限制
- 如果需要查询子目录,可以修改
expression参数,比如HEAD:docs来查询docs目录下的内容
解决安装问题的小技巧
如果你之前安装BeautifulSoup或requests遇到问题,大概率是网络原因:
- 用国内PyPI镜像源安装,比如清华源:
pip install requests beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple - 如果是虚拟环境问题,先确认你激活了对应的虚拟环境再执行安装命令
内容的提问来源于stack exchange,提问作者Jakub Bláha
相关产品推荐
相关产品推荐

