如何通过GitHub Contents API更新二进制Excel(XLSX)文件?
解决GitHub Repository Contents API更新XLSX二进制文件的问题
问题根源
你遇到的核心问题:
- 使用PyGitHub时,传递给
update_file的content参数是Base64编码的bytes对象,但API要求的是Base64编码后的字符串。直接传bytes会导致GitHub将其解析为文本,而非解码为二进制文件。 - 使用requests时,参数结构错误:headers被放在了请求体字典中,而非单独作为请求头传递,同时content参数同样需要是Base64字符串而非bytes。
正确的PyGitHub实现代码
修正Base64编码部分,将bytes对象解码为UTF-8字符串:
import base64 from github import GitHub # 初始化GitHub客户端 g = GitHub(my_admin_token) repo = g.get_repo("theowner/therepo") contents = repo.get_contents("myfile.xlsx", ref="main") sha = contents.sha # 读取本地XLSX文件并编码为Base64字符串 with open('my_new_file.xlsx', 'rb') as f: data = f.read() # 关键:将bytes类型的Base64编码结果转为字符串 base64_encoded_data = base64.b64encode(data).decode('utf-8') # 更新仓库中的文件 result = repo.update_file( contents.path, "auto-committed: update XLSX file", base64_encoded_data, sha, branch="main" ) print("Update result:", result)
正确的requests实现代码
调整参数结构,将headers单独传递,同时确保content为Base64字符串:
import base64 import requests # 读取并编码文件 with open('my_new_file.xlsx', 'rb') as f: data = f.read() base64_str = base64.b64encode(data).decode('utf-8') # 请求配置 url = "https://api.github.com/repos/myname/myrepo/contents/myfile.xlsx" headers = { "Authorization": "token my_admin_token", "Accept": "application/vnd.github.v3+json" } payload = { "committer": {"name": "My Name", "email": "me@mymail.com"}, "message": "Update XLSX file", "branch": "main", "content": base64_str, "sha": contents.sha # 先通过GET请求获取原文件的SHA值 } # 发送PUT请求 response = requests.put(url, json=payload, headers=headers) print("Response status code:", response.status_code) print("Response content:", response.json())
注意:使用requests前需要先调用
GET /repos/{owner}/{repo}/contents/{path}接口获取目标文件的SHA值。
curl命令示例
先将本地XLSX文件转为Base64字符串,再发送PUT请求:
# 1. 将本地文件转为Base64字符串(Linux/macOS) BASE64_CONTENT=$(base64 -i my_new_file.xlsx) # 2. 发送PUT请求更新文件 curl -X PUT "https://api.github.com/repos/myname/myrepo/contents/myfile.xlsx" \ -H "Authorization: token my_admin_token" \ -H "Accept: application/vnd.github.v3+json" \ -d '{ "message": "Update XLSX file", "branch": "main", "content": "'"$BASE64_CONTENT"'", "sha": "原文件的SHA值", "committer": { "name": "My Name", "email": "me@mymail.com" } }'
替换
原文件的SHA值为目标文件当前的SHA,可通过curl -H "Authorization: token my_admin_token" https://api.github.com/repos/myname/myrepo/contents/myfile.xlsx获取。
内容的提问来源于stack exchange,提问作者John Puopolo
相关产品推荐
相关产品推荐

