it-swarm.com.de

Laden Sie eine Tabelle mit Python von Google Docs herunter

Können Sie ein Python-Beispiel für das Herunterladen einer Google Docs-Kalkulationstabelle anhand ihrer Schlüssel- und Arbeitsblatt-ID (gid) erstellen? Ich kann nicht.

Ich habe die Versionen 1, 2 und 3 der API durchsucht. Ich habe kein Glück, ich kann ihre zusammengestellte ATOM-artige Feed-API nicht herausfinden, die private Methode gdata.docs.service.DocsService._DownloadFile sagt, dass ich nicht autorisiert bin, und ich möchte nicht selbst ein Google Login-Authentifizierungssystem erstellen. Ich bin im Begriff, mich vor Frustration in das Gesicht zu erstechen.

Ich habe ein paar Tabellenkalkulationen und möchte auf sie wie folgt zugreifen:

username = '[email protected]'
password = getpass.getpass()

def get_spreadsheet(key, gid=0):
    ... (help!) ...

for row in get_spreadsheet('5a3c7f7dcee4b4f'):
    cell1, cell2, cell3 = row
    ...

Bitte rette mein Gesicht.


Update 1: Ich habe folgendes versucht, aber keine Kombination von Download() oder Export() scheint zu funktionieren. (Dokumente für DocsServicehier )

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
28
a paid nerd

Für den Fall, dass jemand auf diese Weise auf eine schnelle Lösung stößt, ist hier eine andere (derzeit) funktionierende Lösung , die nicht von der gdata-Clientbibliothek abhängig ist:

#!/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 __== "__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)
19

Die Bibliothek " https://github.com/burnash/gspread " ist eine neuere, einfachere Möglichkeit, mit Google Spreadsheets zu interagieren, anstatt auf die alten Antworten, die auf die gdata-Bibliothek schließen lassen, die nicht nur zu niedrig ist. ist aber auch zu kompliziert.

Sie müssen außerdem einen Service Account-Schlüssel erstellen und herunterladen (im JSON-Format): https://console.developers.google.com/apis/credentials/serviceaccountkey

Hier ist ein Beispiel, wie man es benutzt:

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())
27
aculich

Sie können versuchen, die AuthSub-Methode zu verwenden, die im Abschnitt Exporting Spreadsheets der Dokumentation beschrieben ist.

Besorgen Sie sich ein separates Login-Token für den Spreadsheets-Dienst, und ersetzen Sie das für den Export. Das Hinzufügen des get_spreadsheet-Codes hat für mich funktioniert:

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

Hinweis Ich habe auch Export verwendet, da Download nur PDF -Dateien enthält.

16
tcarobruce

(Juli 2016) Umformulierung mit der aktuellen Terminologie: "Wie kann ich ein Google Sheet im CSV-Format von Google herunterladen Drive mit Python?". (Google Text & Tabellen bezieht sich jetzt nur auf den Cloud-basierten Textverarbeitungs-Editor, der keinen Zugriff auf Google Sheets-Tabellen bietet.)

Erstens sind alle anderen Antworten ziemlich veraltet oder werden entweder weil sie das alte GData (" Google Data") - Protokoll verwenden , ClientLogin oder AuthSub , alle davon wurden nicht mehr empfohlen. Gleiches gilt für alle Codes oder Bibliotheken, die die Google Sheets API Version 3 oder älter verwenden.

Der moderne Google-API-Zugriff erfolgt mithilfe von API-Schlüsseln (öffentliche Daten) oder OAuth2-Autorisierung (autorisierten Daten), hauptsächlich mit den Google APIs-Clientbibliotheken , einschließlich der für Python . (Und nein, Sie müssen kein vollständiges Authentifizierungssystem erstellen, um auf die APIs zuzugreifen ... siehe den Blogpost unten.)

Um die im/vom OP angeforderte Aufgabe auszuführen, benötigen Sie einen autorisierten Zugriff auf die Google Drive API , um beispielsweise nach bestimmten Sheets zum Herunterladen abzufragen und anschließend die tatsächlichen Exporte auszuführen. Da dies wahrscheinlich eine übliche Operation ist, habe ich einen blogpost geschrieben, der ein Codeausschnitt freigibt, der dies für Sie erledigt. Wenn Sie dies noch weiter verfolgen möchten, habe ich ein weiteres Paar von posts zusammen mit einem Video, in dem beschrieben wird, wie Sie Dateien zu Google Drive hochladen und von Google Drive herunterladen.

Beachten Sie, dass es auch eine neuere Google Sheets API v4 gibt, die jedoch hauptsächlich für spreadsheet-orientierte Operationen gilt, dh Daten einfügen, Tabellenzeilen lesen, Zellen formatieren, Diagramme erstellen, Pivot-Tabellen hinzufügen, usw., nicht dateibasierte Anforderung Exportieren, wenn die Laufwerk-API die richtige ist.

Ein Beispiel für das Exportieren eines Google Sheet als CSV von Drive finden Sie unter diesem Blogbeitrag habe ich geschrieben. Weitere Informationen zur Verwendung von Google Sheets mit Python finden Sie unter diese Antwort habe ich geschrieben für eine ähnliche Frage.

Wenn Sie mit Google-APIs noch nicht vertraut sind, müssen Sie zunächst einen Schritt zurückgehen und diese Videos zuerst überprüfen:

3
wescpy

Dies funktioniert ab gdata 2.0.1.4 nicht mehr:

Gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken())

Stattdessen musst du Folgendes tun:

Gd_client.SetClientLoginToken(gdata.gauth.ClientLoginToken(spreadsheets_client.GetClientLoginToken()))
3
KPax

Der folgende Code funktioniert in meinem Fall (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
2
grin

Ich habe @ Camerons Antwort noch weiter vereinfacht, indem ich die unnötige Objektorientierung entfernt habe. Dies macht den Code kleiner und verständlicher. Ich habe auch die URL bearbeitet, was vielleicht besser funktioniert.

#!/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 __== "__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)

Gspread ist in der Tat eine große Verbesserung gegenüber GoogleCL und Gdata (die ich beide zugunsten von Gspread verwendet und zum Glück ausgetreten bin). Ich denke, dass dieser Code noch schneller ist als die vorherige Antwort, um den Inhalt des Blattes zu erhalten:

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)
0
DeltaG

Dies ist keine vollständige Antwort, aber Andreas Kahler schrieb eine interessante CMS-Lösung mit Google Docs + Google App Engline + Python auf. Ich habe keine Erfahrung in diesem Bereich und kann nicht genau erkennen, welcher Teil des Codes für Sie von Nutzen sein könnte. Ich weiß, dass es mit einem Google Docs-Konto verbunden ist und mit Dateien spielt. Ich habe also das Gefühl, dass Sie erkennen, was los ist. Es sollte Sie zumindest in die richtige Richtung weisen.

Google AppEngine + Google Text & Tabellen + Einige Python = Einfaches CMS

0
nearlymonolith

(16. Dezember) Versuchen Sie es mit einer anderen Bibliothek, die ich geschrieben habe: pygsheets . Es ist ähnlich wie gspread, verwendet aber Google API V4. Es verfügt über eine export-Methode zum Exportieren einer Kalkulationstabelle.

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)
0
nithin

(März 2019, Python 3) Meine Daten sind normalerweise nicht vertraulich und ich verwende normalerweise ein CSV-ähnliches Tabellenformat.

In einem solchen Fall kann man das Blatt einfach publish to the web Und dann als CSV-Datei auf einem Server verwenden.

(Man veröffentlicht es mit File -> Publish to the web ... -> Sheet 1 -> Comma separated values (.csv) -> Publish).

import csv
import io
import requests

url = "https://docs.google.com/spreadsheets/d/e/<GOOGLE_ID>/pub?gid=0&single=true&output=csv"  # you can get the whole link in the 'Publish to the web' dialog
r = requests.get(url)
r.encoding = 'utf-8'
csvio = io.StringIO(r.text, newline="")
data = []
for row in csv.DictReader(csvio):
    data.append(row)
0
Michal Skop