如何解决使用Python将数据推送到在线GitHub存储库
我正在寻求有关如何有效利用Python提交单个文件并将其推送到在线GitHub存储库的信息。
用例非常简单-我每天从API提取一些数据,我想将提取的数据发送到在线仓库。
我目前正在使用pyGithub,但我只能想象这会增加不必要的复杂性。
我敢肯定,我缺乏成功的原因仅仅是缺乏经验。但是,关于这个主题(我发现)似乎没有任何出色的教程。到目前为止,我提出的唯一解决方案如下所示(大多数都是在Stack Overflow上从另一个用户那里刷来的)。
from github import Github
from github import InputGitTreeElement
def sendData(data):
g = Github("-------------------------------------------")
repo = g.get_user().get_repo("--------------")
fileList = ["E:/----------------/test.txt"]
fileName = "test.txt"
commit_message = "test commit using Python"
master_ref = repo.get_git_ref('heads/main')
master_sha = master_ref.object.sha
base_tree = repo.get_git_tree(master_sha)
elementList = list()
for file in fileList:
with open(file) as input_file:
data = input_file.read()
element = InputGitTreeElement(fileName,'100644','blob',data) # https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-tree
elementList.append(element)
tree = repo.create_git_tree(elementList,base_tree)
parent = repo.get_git_commit(master_sha)
commit = repo.create_git_commit(commit_message,tree,[parent])
master_ref.edit(commit.sha)
只要您将这些文件存储在本地并知道其文件路径,此解决方案就可以对commit
和push
进行多个或单个文件的工作。
但是,我不确定如何使用sendData()
函数当前所需的,在内存中打开且没有现有文件路径的文件。
以以下功能为例:
import requests
import json
def getData():
apiKey = "-----------"
try:
response = requests.get('-----------%s' % apiKey)
response.raise_for_status()
# access JSON content
jsonResponse = response.json()
with open('data.json','w',encoding='utf-8') as data:
json.dump(jsonResponse,data,ensure_ascii=False,indent=4)
return data
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except Exception as err:
print(f'Other error occurred: {err}')
上面的方法非常适合从API和return
打开的json文件中提取JSON响应。
但是,我现在需要获取这个打开的json文件,并将其发送到我的在线GitHub存储库中。是先保存在本地然后将“保存的文件”推送到GitHub的答案?
理想情况下,我想简单地将打开的JSON文件传递给sendData()
函数,并将函数commit
和push
传递给我的在线GitHub存储库。
我希望有一个更简单的解决方案,用于将单个文件提交/推送到GitHub存储库。
我正在积极地从事这个项目,因此这个问题将经常更新,直到找到合理的解决方案为止。如果有人有任何想法或意见,我将不胜感激。
当前状态
import requests
import json
from github import Github
from github import InputGitTreeElement
def getData():
apiKey = "-----------------------------"
try:
response = requests.get('https://----------------.json?apiKey=%s' % apiKey)
response.raise_for_status()
# access JSON content
jsonResponse = response.json()
with open('data.json',indent=4)
return data
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except Exception as err:
print(f'Other error occurred: {err}')
def sendData(new_data):
# GitHub access token - limited public repo access only
g = Github("----------------------------------------")
repo = g.get_user().get_repo("-----------")
fileName = "test data.json"
commit_message = "test commit using Python"
master_ref = repo.get_git_ref('heads/main')
master_sha = master_ref.object.sha
base_tree = repo.get_git_tree(master_sha)
elementList = list()
element = InputGitTreeElement(fileName,new_data) # https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-tree
elementList.append(element)
tree = repo.create_git_tree(elementList,[parent])
master_ref.edit(commit.sha)
def main():
data = getData()
sendData(data)
main()
当前错误
Traceback (most recent call last):
File "<input>",line 45,in <module>
File "<input>",line 43,in main
File "<input>",line 33,in sendData
File "C:\Users\chris\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\github\InputGitTreeElement.py",line 58,in __init__
assert content is github.GithubObject.NotSet or isinstance(
AssertionError: <_io.TextIOWrapper name='data.json' mode='w' encoding='utf-8'>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。