Python 如何使用请求从Github下载和写入文件
假设有一个文件存在于github repo中: 我试图使用请求来请求这个文件,将其内容写入当前工作目录中的磁盘,以便以后使用。现在,我正在使用以下代码:Python 如何使用请求从Github下载和写入文件,python,github,python-requests,Python,Github,Python Requests,假设有一个文件存在于github repo中: 我试图使用请求来请求这个文件,将其内容写入当前工作目录中的磁盘,以便以后使用。现在,我正在使用以下代码: import requests from os import getcwd url = "https://github.com/someguy/brilliant/blob/master/somefile.txt" directory = getcwd() filename = directory + 'somefile.txt' r =
import requests
from os import getcwd
url = "https://github.com/someguy/brilliant/blob/master/somefile.txt"
directory = getcwd()
filename = directory + 'somefile.txt'
r = requests.get(url)
f = open(filename,'w')
f.write(r.content)
毫无疑问,这很难看,更重要的是,它不起作用。我得到的不是预期的文本,而是:
<!DOCTYPE html>
<!--
Hello future GitHubber! I bet you're here to remove those nasty inline styles,
DRY up these templates and make 'em nice and re-usable, right?
Please, don't. https://github.com/styleguide/templates/2.0
-->
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Page not found · GitHub</title>
<style type="text/css" media="screen">
body {
background: #f1f1f1;
font-family: "HelveticaNeue", Helvetica, Arial, sans-serif;
text-rendering: optimizeLegibility;
margin: 0; }
.container { margin: 50px auto 40px auto; width: 600px; text-align: center; }
a { color: #4183c4; text-decoration: none; }
a:visited { color: #4183c4 }
a:hover { text-decoration: none; }
h1 { letter-spacing: -1px; line-height: 60px; font-size: 60px; font-weight: 100; margin: 0px; text-shadow: 0 1px 0 #fff; }
p { color: rgba(0, 0, 0, 0.5); margin: 20px 0 40px; }
ul { list-style: none; margin: 25px 0; padding: 0; }
li { display: table-cell; font-weight: bold; width: 1%; }
#error-suggestions { font-size: 14px; }
#next-steps { margin: 25px 0 50px 0;}
#next-steps li { display: block; width: 100%; text-align: center; padding: 5px 0; font-weight: normal; color: rgba(0, 0, 0, 0.5); }
#next-steps a { font-weight: bold; }
.divider { border-top: 1px solid #d5d5d5; border-bottom: 1px solid #fafafa;}
#parallax_wrapper {
position: relative;
z-index: 0;
}
#parallax_field {
overflow: hidden;
position: absolute;
left: 0;
top: 0;
height: 370px;
width: 100%;
}
未找到页面·;github
身体{
背景#f1f1;
字体系列:“HelveticaNeue”,Helvetica,Arial,无衬线;
文本呈现:优化易读性;
边距:0;}
.container{边距:50px自动40px自动;宽度:600px;文本对齐:居中;}
a{color:#4183c4;文本装饰:无;}
答:访问{color:#4183c4}
a:悬停{文本装饰:无;}
h1{字母间距:-1px;行高:60px;字体大小:60px;字体重量:100;边距:0px;文本阴影:0 1px 0#fff;}
p{color:rgba(0,0,0,0.5);边距:20px 0 40px;}
ul{列表样式:无;边距:25px 0;填充:0;}
li{显示:表格单元格;字体大小:粗体;宽度:1%;}
#错误建议{字体大小:14px;}
#下一步{边距:25px 0 50px 0;}
#下一步li{显示:块;宽度:100%;文本对齐:居中;填充:5px 0;字体重量:正常;颜色:rgba(0,0,0,0.5);}
#接下来的步骤a{font-weight:bold;}
.分隔符{边框顶部:1px实心#d5d5d5;边框底部:1px实心#fafafa;}
#视差{
位置:相对位置;
z指数:0;
}
#视差场{
溢出:隐藏;
位置:绝对位置;
左:0;
排名:0;
高度:370px;
宽度:100%;
}
等等。来自Github的内容,但不是文件的内容。我做错了什么?相关文件的内容包含在返回的数据中。您将获得该文件的完整GitHub视图,而不仅仅是内容 如果只想下载文件,需要使用页面顶部的
Raw
链接,该链接将是(例如):
注意域名的变化,路径的blob/
部分消失了
要通过请求
GitHub存储库本身演示这一点:
>>> import requests
>>> r = requests.get('https://github.com/kennethreitz/requests/blob/master/README.rst')
>>> 'Requests:' in r.text
True
>>> r.headers['Content-Type']
'text/html; charset=utf-8'
>>> r = requests.get('https://raw.github.com/kennethreitz/requests/master/README.rst')
>>> 'Requests:' in r.text
True
>>> r.headers['Content-Type']
'text/plain; charset=utf-8'
>>> print r.text
Requests: HTTP for Humans
=========================
.. image:: https://travis-ci.org/kennethreitz/requests.png?branch=master
[... etc. ...]
您需要从
https://raw.github.com
请看区别:
vs
此外,您可能应该在目录和文件名之间添加一个/
:
>>> getcwd()+'foo.txt'
'/Users/burhanfoo.txt'
>>> import os
>>> os.path.join(getcwd(),'foo.txt')
'/Users/burhan/foo.txt'
作为更新,
https://raw.github.com
至https://raw.githubusercontent.com
。因此,一般的格式是:
url = "https://raw.githubusercontent.com/user/repo/branch/[subfolders]/file"
例如。仍然使用
requests.get(url)
,就像Martijn的回答一样。您应该真正使用os.path.join()
来组合路径getcwd()
不一定返回以路径分隔符结尾的目录名。如果要访问私有存储库中的文件,基本身份验证工作正常:requests.get(“”,auth=('username','passwd'))arg,代码段出错,这里再次:requests.get('https://raw.github.com/myfile.txt",auth=('username'、'passwd'))
这是一个比公认答案简单得多的实现,对我来说非常有效。谢谢!Wdym这与他刚才没有给出的示例完全一样???lel
url = "https://raw.githubusercontent.com/user/repo/branch/[subfolders]/file"