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.
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:
- Cómo utilizar las API de Google y crear proyectos API : la interfaz de usuario ha cambiado pero los conceptos siguen siendo los mismos
- Tutorial del código de autorización (Python): puede usar cualquier idioma compatible para acceder a las API de Google; Si no haces Python, úsalo como pseudocódigo para ayudarte a comenzar
- Listado de tus archivos en Google Drive y código postal de inmersión profunda