Cómo download y escribir un file desde Github usando Solicitudes

Digamos que hay un file que vive en el repository github:

https://github.com/someguy/brilliant/blob/master/somefile.txt

Intento utilizar las requestes para solicitar este file, escribir el contenido del mismo en el disco en el directory de trabajo actual donde se puede usar más adelante. En este momento, estoy usando el siguiente código:

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) 

Sin dudas feo, y más importante, no funciona. En lugar del text esperado, obtengo:

 <!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 &middot; 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%; } 

etcétera etcétera.

Contenido de Github, pero no el contenido del file. ¿Qué estoy haciendo mal?

El contenido del file en cuestión está incluido en los datos devueltos. Obtendrá la vista completa de GitHub de ese file, no solo los contenidos.

Si desea download solo el file, debe usar el enlace Raw en la parte superior de la página, que será (para su ejemplo):

 https://raw.github.com/someguy/brilliant/master/somefile.txt 

Tenga en count el cambio en el nombre de dominio, y el blob/ parte de la ruta se ha ido.

Para demostrar esto con las requests repository GitHub en sí:

 >>> 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. ...] 

Debe solicitar la versión sin procesar del file, desde https://raw.github.com .

Ver la diferencia:

https://raw.github.com/django/django/master/setup.py vs. https://github.com/django/django/blob/master/setup.py

Además, probablemente debas agregar un / entre tu directory y el nombre del file:

 >>> getcwd()+'foo.txt' '/Users/burhanfoo.txt' >>> import os >>> os.path.join(getcwd(),'foo.txt') '/Users/burhan/foo.txt'