Pobierz arkusz kalkulacyjny z Google Docs za pomocą Pythona

Czy możesz stworzyć przykład Pythona, jak pobrać arkusz kalkulacyjny Google Docs, biorąc pod uwagę jego klucz i identyfikator arkusza roboczego (gid)? Nie mogę.

Przeszukałem wersje 1, 2 i 3 API. Nie mam szczęścia, nie mogę rozgryźć ich skompilowanego ATOM-like feeds API, prywatna Metoda gdata.docs.service.DocsService._DownloadFile mówi, że jestem nieautoryzowany, a sam nie chcę pisać całego systemu uwierzytelniania logowania Google. Zaraz dźgnę się w twarz z powodu frustracji.

Mam kilka arkuszy kalkulacyjnych a ja chcę mieć do nich dostęp w ten sposób:

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

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

for row in get_spreadsheet('5a3c7f7dcee4b4f'):
    cell1, cell2, cell3 = row
    ...
Proszę ocal moją twarz.

Update 1: próbowałem następujących, ale Żadna kombinacja Download() lub Export() nie wydaje się działać. (Docs for DocsService tutaj )

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
Author: Mark Johnson, 2010-07-20

10 answers

W przypadku, gdyby ktoś natknął się na to, szukając szybkiej poprawki, oto inne (obecnie) działające rozwiązanie, które nie opiera się na bibliotece klienta 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)
 18
Author: Cameron Spickert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-25 16:22:34

The https://github.com/burnash/gspread Biblioteka jest nowszym, prostszym sposobem interakcji z arkuszami kalkulacyjnymi Google, a nie starymi odpowiedziami na to, które sugerują bibliotekę gdata, która jest nie tylko zbyt niska, ale także zbyt skomplikowana.

Będziesz również musiał utworzyć i pobrać (w formacie JSON) klucz konta usługi: https://console.developers.google.com/apis/credentials/serviceaccountkey

Oto przykład jak z niego korzystać:

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())
 25
Author: aculich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-16 12:25:28

Możesz spróbować użyć metody AuthSub opisanej w sekcji eksportowanie arkuszy kalkulacyjnych w dokumentacji.

Uzyskaj osobny token logowania dla usługi arkuszy kalkulacyjnych i zastąp go eksportem. Dodanie tego do kodu get_spreadsheet zadziałało dla mnie:

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

Zauważ, że używałem również Export, ponieważ Download wydaje się dawać tylko pliki PDF.

 16
Author: tcarobruce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 23:28:24

To już nie działa od gdata 2.0.1.4:

gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken())

Zamiast tego musisz zrobić:

gd_client.SetClientLoginToken(gdata.gauth.ClientLoginToken(spreadsheets_client.GetClientLoginToken()))
 3
Author: KPax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 17:24:55

(Jul 2016) przeprojektowanie obecnej terminologii: " Jak pobrać arkusz Google w formacie CSV z Dysku Google używając Pythona?". (Dokumenty Google odnoszą się teraz tylko do edytora tekstu/edytora tekstu opartego na chmurze, który nie zapewnia dostępu do arkuszy kalkulacyjnych Google Sheets.)

Po pierwsze, wszystkie inne odpowiedzi są dość przestarzałe lub będą, albo dlatego, że używają starego GData ("Google Data") protokół, ClientLogin , lub AuthSub , z których wszystkie zostały wycofane. To samo dotyczy wszystkich kodów lub bibliotek, które używają Google Sheets API w wersji 3 lub starszej.

[[0]} Nowoczesny dostęp do API Google odbywa się za pomocą kluczy API (dane publiczne) lub autoryzacji OAuth2( dane autoryzowane), głównie z bibliotek klientów API Google, w tym dla Pythona. (I nie, nie musisz budować całego systemu auth tylko po to, aby uzyskać dostęp do interfejsów API... Zobacz post na blogu poniżej.)

Aby wykonać zadanie wymagane w / przez OP, potrzebujesz autoryzowanego dostępu do Google Drive API , być może do zapytania o konkretne arkusze do pobrania, a następnie do wykonania rzeczywistego (- ych) eksportu (- ów). Ponieważ jest to prawdopodobnie powszechna operacja, napisałem blogpost dzieląc się fragmentem kodu, który robi to za Ciebie. Jeśli chcesz kontynuować to jeszcze bardziej, mam kolejną parę postów wraz z filmem, który przedstawia, jak przesyłać pliki i pobierać pliki z Dysku Google.

Zauważ, że istnieje również nowszy Google Sheets API v4, ale jest to przede wszystkim dla operacji zorientowanych na arkusz kalkulacyjny, tj. wstawianie danych, czytanie wierszy arkusza kalkulacyjnego, Formatowanie komórek, tworzenie wykresów, dodawanie tabel przestawnych itp., nie żądanie oparte na plikach, jak eksportowanie, w którym API dysku jest właściwym do użycia.

Aby zobaczyć przykład eksportu arkusza Google jako CSV z dysku, sprawdź ten wpis na blogu napisałem; aby dowiedzieć się więcej o korzystaniu z Arkuszy Google z Python, zobacz tę odpowiedź napisałem na podobne pytanie.

Jeśli jesteś zupełnie nowy w interfejsach API Google, musisz zrobić kolejny krok wstecz i najpierw przejrzeć te filmy:

 3
Author: wescpy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 01:43:21

Poniższy kod działa w moim przypadku (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
Author: grin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-07 23:06:00

Uprościłem odpowiedź @ Cameron jeszcze bardziej, usuwając niepotrzebną orientację obiektu. To sprawia, że kod jest mniejszy i łatwiejszy do zrozumienia. Edytowałem również adres url, który może działać lepiej.

#!/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)
 1
Author: Michael Matthew Toomim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-12 01:04:59

To nie jest kompletna odpowiedź, ale Andreas Kahler napisał ciekawe rozwiązanie CMS przy użyciu Google Docs + Google App Engline + Python. Nie mając żadnego doświadczenia w tej dziedzinie, nie widzę dokładnie, która część kodu może być dla Ciebie przydatna, ale sprawdź to. Wiem, że łączy się z kontem Google Docs i gra z plikami, więc mam wrażenie, że rozpoznasz, co się dzieje. To powinno przynajmniej wskazać ci właściwy kierunek.

Google AppEngine + Google Docs + Some Python = Simple CMS

 0
Author: nearlymonolith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 16:58:42

Gspread jest rzeczywiście dużym ulepszeniem w stosunku do GoogleCL i Gdata(oba z których korzystałem i na szczęście wycofałem się na rzecz Gspread). Myślę, że ten kod jest jeszcze szybszy niż wcześniejsza odpowiedź, aby uzyskać zawartość arkusza:

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
Author: DeltaG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-14 03:15:47

(Dec 16) wypróbuj inną bibliotekę, którą napisałem: pygsheets . Jest podobny do gspread, ale korzysta z Google api v4. Posiada metodę export do eksportu arkusza kalkulacyjnego.

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
Author: nithin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-11 14:18:30