2013-01-02 20 views
13

powiedzmy, że jest to plik, który żyje w repo github:Jak pobrać i zapisać plik z Github za pomocą żądań

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

Próbuję użyć żądania do żądania tego pliku, wpisz treść na dysk w bieżącym katalogu roboczym, gdzie można go później użyć. Teraz używam następującego kodu:

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) 

Niewątpliwie brzydki, a co ważniejsze, nie działa. Zamiast oczekiwanego tekstu, otrzymuję:

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

itp itd

zawartość z Github, ale nie zawartość pliku. Co ja robię źle?

+2

Należy naprawdę użyć 'os.path. join() 'do łączenia ścieżek. 'getcwd()' niekoniecznie zwraca nazwę katalogu kończącą się w separatorze ścieżek. –

Odpowiedz

9

Zawartość tego pliku to dołączona w zwróconych danych. Otrzymujesz pełny widok tego pliku GitHub, a nie tylko zawartość.

Jeśli chcesz pobrać tylko plik, trzeba skorzystać z linku Raw w górnej części strony, która będzie (dla przykładu):

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

Uwaga zmiana domeny nazwa, a część ścieżki została usunięta.

Aby zademonstrować to z repozytorium requests GitHub samego:

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

Pokonaj mnie! :) (ale do cholery, co tam nowego!) (na marginesie - przypuszczam, że byłoby to możliwe przy użyciu 'pygit' - który może być bardziej przydatny/elastyczny sposób, aby OP działał z rzeczami w przyszłości) –

+0

@Jonclements : 'pygit' jest raczej niskim poziomem, prawda? –

+0

I rozwiązany - dziękuję również za wskazówkę dotyczącą właściwego sposobu dołączania nazwy pliku/katalogu. Akceptacja, gdy upłynie czas. – Fomite

3

Trzeba zwrócić surową wersję pliku z https://raw.github.com.

Zobacz różnicę:

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

Również powinieneś dodać / między katalogu i nazwy pliku:

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

Jest to znacznie prostsza implementacja niż zaakceptowana odpowiedź i będzie działać idealnie dla mnie. Dziękuję Ci! – dslosky

Powiązane problemy