sheets manager gspread google python google-docs google-docs-api gdata-python-client

manager - Descarga una hoja de cálculo de Google Docs usando Python



python google sheets (10)

¿Puede producir un ejemplo de Python sobre cómo descargar una hoja de cálculo de Google Docs dada su clave y su ID de hoja de trabajo ( gid )? No puedo

He rastreado las versiones 1, 2 y 3 de la API. No estoy teniendo suerte, no puedo entender su compilación de feeds de tipo ATOM, el método privado gdata.docs.service.DocsService._DownloadFile dice que no estoy autorizado, y no quiero escribir un entero Sistema de autenticación de inicio de sesión de Google a mí mismo. Estoy a punto de apuñalarme en la cara debido a la frustración.

Tengo algunas hojas de cálculo y quiero acceder a ellas así:

username = ''[email protected]'' password = getpass.getpass() def get_spreadsheet(key, gid=0): ... (help!) ... for row in get_spreadsheet(''5a3c7f7dcee4b4f''): cell1, cell2, cell3 = row ...

Por favor salva mi cara.

Actualización 1: probé lo siguiente, pero ninguna combinación de Download() o Export() parece funcionar. (Docs para DocsService here )

import gdata.docs.service import getpass import os import tempfile import csv def get_csv(file_path): return csv.reader(file(file_path).readlines()) def get_spreadsheet(key, gid=0): gd_client = gdata.docs.service.DocsService() gd_client.email = ''[email protected]'' gd_client.password = getpass.getpass() gd_client.ssl = False gd_client.source = "My Fancy Spreadsheet Downloader" gd_client.ProgrammaticLogin() file_path = tempfile.mktemp(suffix=''.csv'') uri = ''http://docs.google.com/feeds/documents/private/full/%s'' % key try: entry = gd_client.GetDocumentListEntry(uri) # XXXX - The following dies with RequestError "Unauthorized" gd_client.Download(entry, file_path) return get_csv(file_path) finally: try: os.remove(file_path) except OSError: pass


El siguiente código funciona en mi caso (Ubuntu 10.4, Python 2.6.5 gdata 2.0.14)

import gdata.docs.service import gdata.spreadsheet.service gd_client = gdata.docs.service.DocsService() gd_client.ClientLogin(email,password) spreadsheets_client = gdata.spreadsheet.service.SpreadsheetsService() spreadsheets_client.ClientLogin(email,password) #... file_path = file_path.strip()+".xls" docs_token = gd_client.auth_token gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken()) gd_client.Export(entry, file_path) gd_client.auth_token = docs_token


En caso de que alguien se encuentre con esto buscando una solución rápida, aquí hay otra solución (actualmente) que funciona y que no depende de la biblioteca del cliente gdata:

#!/usr/bin/python import re, urllib, urllib2 class Spreadsheet(object): def __init__(self, key): super(Spreadsheet, self).__init__() self.key = key class Client(object): def __init__(self, email, password): super(Client, self).__init__() self.email = email self.password = password def _get_auth_token(self, email, password, source, service): url = "https://www.google.com/accounts/ClientLogin" params = { "Email": email, "Passwd": password, "service": service, "accountType": "HOSTED_OR_GOOGLE", "source": source } req = urllib2.Request(url, urllib.urlencode(params)) return re.findall(r"Auth=(.*)", urllib2.urlopen(req).read())[0] def get_auth_token(self): source = type(self).__name__ return self._get_auth_token(self.email, self.password, source, service="wise") def download(self, spreadsheet, gid=0, format="csv"): url_format = "https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=%s&exportFormat=%s&gid=%i" headers = { "Authorization": "GoogleLogin auth=" + self.get_auth_token(), "GData-Version": "3.0" } req = urllib2.Request(url_format % (spreadsheet.key, format, gid), headers=headers) return urllib2.urlopen(req) if __name__ == "__main__": import getpass import csv email = "" # (your email here) password = getpass.getpass() spreadsheet_id = "" # (spreadsheet id here) # Create client and spreadsheet objects gs = Client(email, password) ss = Spreadsheet(spreadsheet_id) # Request a file-like object containing the spreadsheet''s contents csv_file = gs.download(ss) # Parse as CSV and print the rows for row in csv.reader(csv_file): print ", ".join(row)


Esta no es una respuesta completa, pero Andreas Kahler escribió una interesante solución de CMS con Google Docs + Google App Engline + Python. Al no tener ninguna experiencia en el área, no puedo ver exactamente qué parte del código puede ser de utilidad para usted, pero échele un vistazo. Sé que interactúa con una cuenta de Google Docs y juega con archivos, así que tengo la sensación de que reconocerás lo que está pasando. Al menos debería apuntarle en la dirección correcta.

Google AppEngine + Google Docs + Some Python = CMS simple


Esto ya no funciona a partir de gdata 2.0.1.4:

gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken())

En su lugar, tienes que hacer:

gd_client.SetClientLoginToken(gdata.gauth.ClientLoginToken(spreadsheets_client.GetClientLoginToken()))


Gspread es, de hecho, una gran mejora con respecto a GoogleCL y Gdata (que he usado y afortunadamente eliminado en favor de Gspread). Creo que este código es incluso más rápido que la respuesta anterior para obtener el contenido de la hoja:

username = ''[email protected]'' password = ''sdfsdfsadfsdw'' sheetname = "Sheety Sheet" client = gspread.login(username, password) spreadsheet = client.open(sheetname) worksheet = spreadsheet.sheet1 contents = [] for rows in worksheet.get_all_values(): contents.append(rows)


He simplificado aún más la respuesta de @Cameron, eliminando la orientación innecesaria del objeto. Esto hace que el código sea más pequeño y más fácil de entender. También edité la url, que podría funcionar mejor.

#!/usr/bin/python import re, urllib, urllib2 def get_auth_token(email, password): url = "https://www.google.com/accounts/ClientLogin" params = { "Email": email, "Passwd": password, "service": ''wise'', "accountType": "HOSTED_OR_GOOGLE", "source": ''Client'' } req = urllib2.Request(url, urllib.urlencode(params)) return re.findall(r"Auth=(.*)", urllib2.urlopen(req).read())[0] def download(spreadsheet, worksheet, email, password, format="csv"): url_format = ''https://docs.google.com/spreadsheets/d/%s/export?exportFormat=%s#gid=%s'' headers = { "Authorization": "GoogleLogin auth=" + get_auth_token(email, password), "GData-Version": "3.0" } req = urllib2.Request(url_format % (spreadsheet, format, worksheet), headers=headers) return urllib2.urlopen(req) if __name__ == "__main__": import getpass import csv spreadsheet_id = "" # (spreadsheet id here) worksheet_id = '''' # (gid here) email = "" # (your email here) password = getpass.getpass() # Request a file-like object containing the spreadsheet''s contents csv_file = download(spreadsheet_id, worksheet_id, email, password) # Parse as CSV and print the rows for row in csv.reader(csv_file): print ", ".join(row)


La https://github.com/burnash/gspread library es una forma más nueva y sencilla de interactuar con Google Spreadsheets, en lugar de las respuestas anteriores que sugieren la biblioteca gdata , que no solo es de muy bajo nivel, sino que también es demasiado -Complicado.

También deberá crear y descargar (en formato JSON) una clave de cuenta de servicio: https://console.developers.google.com/apis/credentials/serviceaccountkey

Aquí hay un ejemplo de cómo usarlo:

import csv import gspread from oauth2client.service_account import ServiceAccountCredentials scope = [''https://spreadsheets.google.com/feeds''] credentials = ServiceAccountCredentials.from_json_keyfile_name(''credentials.json'', scope) docid = "0zjVQXjJixf-SdGpLKnJtcmQhNjVUTk1hNTRpc0x5b9c" client = gspread.authorize(credentials) spreadsheet = client.open_by_key(docid) for i, worksheet in enumerate(spreadsheet.worksheets()): filename = docid + ''-worksheet'' + str(i) + ''.csv'' with open(filename, ''wb'') as f: writer = csv.writer(f) writer.writerows(worksheet.get_all_values())


Puede intentar usar el método AuthSub descrito en la sección Exportación de hojas de cálculo de la documentación.

Obtenga un token de inicio de sesión separado para el servicio de hojas de cálculo y sustitúyalo por la exportación. Agregando esto al código get_spreadsheet funcionó para mí:

import gdata.spreadsheet.service def get_spreadsheet(key, gid=0): # ... spreadsheets_client = gdata.spreadsheet.service.SpreadsheetsService() spreadsheets_client.email = gd_client.email spreadsheets_client.password = gd_client.password spreadsheets_client.source = "My Fancy Spreadsheet Downloader" spreadsheets_client.ProgrammaticLogin() # ... entry = gd_client.GetDocumentListEntry(uri) docs_auth_token = gd_client.GetClientLoginToken() gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken()) gd_client.Export(entry, file_path) gd_client.SetClientLoginToken(docs_auth_token) # reset the DocList auth token

Note que también usé Export , ya que Download parece dar solo archivos PDF.


(16 de diciembre) Prueba con otra biblioteca que escribí: pygsheets . Es similar a gspread, pero usa google api v4. Tiene un método de exportación para exportar hoja de cálculo.

import pygsheets gc = pygsheets.authorize() # Open spreadsheet and then workseet sh = gc.open(''my new ssheet'') wks = sh.sheet1 #export as csv wks.export(pygsheets.ExportType.CSV)


(Jul 2016) Replanteando con la terminología actual: " ¿Cómo descargo una hoja de Google en formato CSV de Google Drive usando Python ?". (Google Docs ahora solo hace referencia al procesador de textos / editor de texto basado en la nube que no proporciona acceso a las hojas de cálculo de Google Sheets).

En primer lugar, todas las demás respuestas están bastante desfasadas o lo estarán, ya sea porque usan el antiguo Protocolo GData (" Datos de Google") , developers.google.com/identity/protocols/AuthForInstalledApps o AuthSub , todos los cuales han quedado en desuso. Lo mismo se aplica a todos los códigos o bibliotecas que utilizan la API de Google Sheets v3 o anterior.

El acceso moderno a la API de Google se produce mediante claves de la API (datos públicos) o autorización OAuth2 (datos autorizados), principalmente con las bibliotecas de clientes de la API de Google , incluida la de Python . (Y no, no tiene que crear un sistema de autenticación completo solo para acceder a las API ... consulte la publicación de blog a continuación).

Para realizar la tarea solicitada en / por el OP, necesita acceso autorizado a la API de Google Drive , tal vez para consultar Hojas específicas para descargar, y luego para realizar las exportaciones reales. Como es probable que se trate de una operación común, escribí una entrada de blogpost comparte un fragmento de código que lo hace por usted. Si desea continuar con esto aún más, tengo otro par de posts junto con un video que describe cómo cargar archivos y descargar archivos de Google Drive.

Tenga en cuenta que también hay una nueva versión de Google Sheets API v4 , pero es principalmente para operaciones orientadas a hojas de cálculo , es decir, insertar datos, leer filas de hojas de cálculo, formatear celdas, crear gráficos, agregar tablas dinámicas, etc., no solicitudes basadas en archivos como exportar donde la API de Drive es la correcta de usar.

Para ver un ejemplo de exportación de una hoja de Google como CSV desde Drive, consulte blogpost que escribí; Para obtener más información sobre el uso de Google Sheets con Python, consulte esta respuesta que escribí para una pregunta similar.

Si eres completamente nuevo en las API de Google, debes retroceder un paso más y revisar estos videos primero: