web-dev-qa-db-fra.com

Comment télécharger et écrire un fichier de GitHub en utilisant les demandes

Disons qu'il y a un dossier qui vit au GitHub Repo:

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

J'essaie d'utiliser des demandes pour demander ce fichier, écrire le contenu de celui-ci sur le disque dans le répertoire de travail actuel où il peut être utilisé ultérieurement. En ce moment, j'utilise le code suivant:

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)

Sans aucun doute moche, et plus important encore, ne fonctionne pas. Au lieu du texte attendu, je reçois:

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

Contenu de GitHub, mais pas le contenu du fichier. Qu'est-ce que je fais mal?

20
Fomite

Le contenu du fichier en question est inclus dans les données retournées. Vous obtenez la vue complète Github de ce fichier, pas seulement le contenu.

Si vous souhaitez télécharger juste Le fichier, vous devez utiliser le lien Raw en haut de la page, qui sera (pour votre exemple):

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

Notez la modification du nom de domaine et la blob/ Une partie du chemin est parti.

Pour démontrer cela avec le référentiel requests github lui-même:

>>> 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. ...]
18
Martijn Pieters

Vous devez demander la version brute du fichier, de https://raw.github.com.

Regarde la différence:

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

En outre, vous devriez probablement ajouter un / entre votre répertoire et le nom de fichier:

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