web-dev-qa-db-fra.com

Obtenir le CSV de la feuille de calcul Google dans A Pandas Dataframe

J'ai téléchargé un fichier sur des feuilles de calcul Google (pour créer un exemple de bloc-notes IPython accessible au public, avec des données) J'utilisais le fichier sous sa forme native pourrait être lu dans un Pandas Dataframe. Alors maintenant, j'utilise le code suivant pour lire la feuille de calcul, fonctionne bien mais vient juste sous forme de chaîne, et je n'ai aucune chance d'essayer de le récupérer dans une trame de données (vous pouvez obtenir les données)

import requests
r = requests.get('https://docs.google.com/spreadsheet/ccc?key=0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc&output=csv')
data = r.content

Les données finissent par ressembler à: (en-têtes de 1ère ligne)

',City,region,Res_Comm,mkt_type,Quradate,National_exp,Alabama_exp,Sales_exp,Inventory_exp,Price_exp,Credit_exp\n0,Dothan,South_Central-Montgomery-Auburn-Wiregrass-Dothan,Residential,Rural,1/15/2010,2,2,3,2,3,3\n10,Foley,South_Mobile-Baldwin,Residential,Suburban_Urban,1/15/2010,4,4,4,4,4,3\n12,Birmingham,North_Central-Birmingham-Tuscaloosa-Anniston,Commercial,Suburban_Urban,1/15/2010,2,2,3,2,2,3\n

Le code natif pandas qui apporte le fichier résident du disque ressemble à:

df = pd.io.parsers.read_csv('/home/tom/Dropbox/Projects/annonallanswerswithmaster1012013.csv',index_col=0,parse_dates=['Quradate'])

Une solution "propre" serait utile à beaucoup pour fournir un moyen facile de partager des ensembles de données pour Pandas use! J'ai essayé un tas d'alternatives sans succès et je suis presque sûr de manquer quelque chose d'évident à nouveau.

Juste une note de mise à jour La nouvelle feuille de calcul Google a un modèle d'URL différent. Utilisez-le simplement à la place de l'URL dans l'exemple ci-dessus et/ou la réponse ci-dessous et tout devrait bien se passer ici est un exemple:

https://docs.google.com/spreadsheets/d/177_dFZ0i-duGxLiyg6tnwNDKruAYE-_Dd8vAQziipJQ/export?format=csv&id

voir la solution ci-dessous de @Max Ghenis qui vient d'utiliser pd.read_csv, pas besoin de StringIO ou de requêtes ...

49
dartdog

Vous pouvez utiliser read_csv() sur un objet StringIO:

from io import BytesIO

import requests
r = requests.get('https://docs.google.com/spreadsheet/ccc?key=0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc&output=csv')
data = r.content

In [10]: df = pd.read_csv(BytesIO(data), index_col=0,parse_dates=['Quradate'])

In [11]: df.head()
Out[11]: 
          City                                            region     Res_Comm  \
0       Dothan  South_Central-Montgomery-Auburn-Wiregrass-Dothan  Residential   
10       Foley                              South_Mobile-Baldwin  Residential   
12  Birmingham      North_Central-Birmingham-Tuscaloosa-Anniston   Commercial   
38       Brent      North_Central-Birmingham-Tuscaloosa-Anniston  Residential   
44      Athens                 North_Huntsville-Decatur-Florence  Residential   

          mkt_type            Quradate  National_exp  Alabama_exp  Sales_exp  \
0            Rural 2010-01-15 00:00:00             2            2          3   
10  Suburban_Urban 2010-01-15 00:00:00             4            4          4   
12  Suburban_Urban 2010-01-15 00:00:00             2            2          3   
38           Rural 2010-01-15 00:00:00             3            3          3   
44  Suburban_Urban 2010-01-15 00:00:00             4            5          4   

    Inventory_exp  Price_exp  Credit_exp  
0               2          3           3  
10              4          4           3  
12              2          2           3  
38              3          3           2  
44              4          4           4  
50
TomAugspurger

Semble fonctionner pour moi sans le StringIO:

test = pd.read_csv('https://docs.google.com/spreadsheets/d/' + 
                   '0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc' +
                   '/export?gid=0&format=csv',
                   # Set first column as rownames in data frame
                   index_col=0,
                   # Parse column values to datetime
                   parse_dates=['Quradate']
                  )
test.head(5)  # Same result as @TomAugspurger

BTW, y compris le ?gid= permet d'importer différentes feuilles, trouvez le gid dans l'URL.

52
Max Ghenis

Ouvrez la feuille spécifique que vous souhaitez dans votre navigateur. Assurez-vous qu'il est au moins visible par toute personne disposant du lien. Copiez et collez l'URL. Vous obtiendrez quelque chose comme https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER.

sheet_url = 'https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER'

D'abord, nous transformons cela en une URL d'exportation CSV, comme https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/export?format=csv&gid=NUMBER:

csv_export_url = sheet_url.replace('/edit#gid=', '/export?format=csv&gid=')

Ensuite, nous le transmettons à pd.read_csv , qui peut prendre une URL.

df = pd.read_csv(csv_export_url)

Cela se cassera si Google modifie son API (cela semble non documenté) et peut donner des erreurs inutiles en cas de défaillance du réseau.

9
Ken Arnold

Mon approche est un peu différente. Je viens d'utiliser pandas.Dataframe () mais j'avais évidemment besoin d'installer et d'importer gspread. Et cela a bien fonctionné!

gsheet = gs.open("Name")
Sheet_name ="today"
wsheet = gsheet.worksheet(Sheet_name)
dataframe = pd.DataFrame(wsheet.get_all_records())
8
Abhery Guha

J'utilise les utilitaires suivants et cela a fonctionné jusqu'à présent:

def load_from_gspreadsheet(sheet_name, key):
    url = 'https://docs.google.com/spreadsheets/d/{key}/gviz/tq?tqx=out:csv&sheet={sheet_name}&headers=1'.format(
        key=key, sheet_name=sheet_name.replace(' ', '%20'))

    log.info('Loading google spreadsheet from {}'.format(url))

    df = pd.read_csv(url)
    return df.drop([col for col in df.columns if col.startswith('Unnamed')], axis=1)

Vous devez spécifier le nom_feuille et la clé. La clé est la chaîne que vous obtenez à partir de l'URL dans le chemin suivant: https://docs.google.com/spreadsheets/d/{key}/edit/.

Vous pouvez modifier la valeur des en-têtes si vous avez plusieurs lignes pour les noms de colonne, mais je ne sais pas si cela fonctionne toujours avec plusieurs en-têtes.

Cela peut freiner si Google modifie ses API.

Veuillez également garder à l'esprit que votre feuille de calcul doit être publique, toute personne disposant du lien peut la lire.

3
Gianmario Spacagna

Si le fichier csv était partagé via le lecteur et non via une feuille de calcul, la modification ci-dessous de l'url fonctionnerait

#Derive the id from the google drive shareable link.
#For the file at hand the link is as below
#<https://drive.google.com/open?id=1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69>
file_id='1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69'
link='https://drive.google.com/uc?export=download&id={FILE_ID}'
csv_url=link.format(FILE_ID=file_id)
#The final url would be as below:-
#csv_url='https://drive.google.com/uc?export=download&id=1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69'
df = pd.read_csv(csv_url)

Et la trame de données serait (si vous venez d'exécuter le code ci-dessus)

    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9   10  11
3   12  13  14  15

Voir le code de travail ici .

3
kaza