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 ...
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
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.
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.
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())
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.
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 .