2013-01-02 1 views
13

permette di dire c'è un file che vive al repo github:Come scaricare e scrivere un file da Github utilizzando le richieste

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

sto cercando di utilizzare le richieste per richiedere questo file, scrivere il contenuto di esso su disco nella directory di lavoro corrente in cui può essere utilizzato in seguito. In questo momento, sto utilizzando il seguente codice:

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) 

Indubbiamente brutto, e ancora più importante, non funziona. Al posto del testo previsto, ottengo:

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

ecc ecc

Contenuto da Github, ma non il contenuto del file. Che cosa sto facendo di sbagliato?

+2

Si dovrebbe usare 'os.path. join() 'per combinare percorsi. 'getcwd()' non restituisce necessariamente un nome di directory che termina con un separatore di percorso. –

risposta

9

Il contenuto del file in questione è incluso nei dati restituiti. Stai ottenendo la visualizzazione completa di GitHub di quel file, non solo i contenuti.

Se volete scaricare solo il file, è necessario utilizzare il link Raw nella parte superiore della pagina, che sarà (per il vostro esempio):

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

nota il cambiamento di dominio nome e la parte del percorso blob/ non esiste più.

Per dimostrare questo con il repository GitHub requests stessa:

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

Mi picchia! :) (ma diamine, cosa c'è di nuovo lì!) (su una nota a margine - indovina sarebbe possibile usare 'pygit' - che potrebbe essere un modo più utile/flessibile per l'OP di lavorare con le cose in futuro) –

+0

@JonClements : 'pygit' è piuttosto basso, però, non è vero? –

+0

E risolto - grazie anche per il suggerimento sul modo corretto di andare sul nome file/directory che unisce. Accettare una volta scaduto il timer. – Fomite

3

È necessario richiedere la versione grezza del file, da https://raw.github.com.

vedere la differenza:

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

Inoltre, probabilmente si dovrebbe aggiungere un / tra la directory e il nome del file:

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

Questa è un'implementazione molto più semplice della risposta accettata e funzionerà perfettamente per me. Grazie! – dslosky