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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:25:37