Загрузите электронную таблицу из Google Docs с помощью Python

можете ли вы привести пример Python о том, как загрузить электронную таблицу Google Docs с учетом ее ключа и идентификатора рабочего листа (gid)? Я не могу.

Я просмотрел версии 1, 2 и 3 API. Мне не повезло, я не могу понять их compilcated ATOM-like feeds API,gdata.docs.service.DocsService._DownloadFile частный метод говорит, что я неавторизован, и я не хочу писать всю систему аутентификации входа в Google. Я собираюсь ударить себя в лицо из-за разочарования.

Я несколько электронных таблиц, и я хочу получить к ним доступ так:

username = 'mygooglelogin@gmail.com'
password = getpass.getpass()

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

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

пожалуйста, спасите мое лицо.


обновление 1: я пробовал следующее, Но никакой комбинации Download() или Export() кажется, работает. (Docs for DocsService здесь)

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 = 'xxxxxxxxx@gmail.com'
  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

10 ответов


если кто-нибудь столкнется с этим, ища быстрое исправление, вот другое (в настоящее время) рабочего раствора это не зависит от клиентской библиотеки 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)

https://github.com/burnash/gspread Библиотека-это новый, более простой способ взаимодействия с электронными таблицами Google, а не старые ответы на это, которые предполагают gdata библиотека, которая не только слишком низкоуровневая, но и чрезмерно сложная.

вам также необходимо создать и загрузить (в формате JSON) ключ учетной записи службы:https://console.developers.google.com/apis/credentials/serviceaccountkey

вот пример как его использовать:

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

вы можете попробовать использовать метод AuthSub, описанный в Экспорт Таблиц раздел документации.

получите отдельный токен входа для службы электронных таблиц и замените его для экспорта. Добавление этого в get_spreadsheet код работал для меня:

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

обратите внимание, что я также использовал Export, as Download кажется, дают только PDF-файлы.


Это больше не работает с gdata 2.0.1.4:

gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken())

вместо этого вам нужно сделать:

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

(июль 2016) перефразирование с текущей терминологией:"как загрузить лист Google в формате CSV из Google диск использование Python?". (Google Docs теперь относится только к облачному текстовому редактору / текстовому редактору, который не предоставляет доступ к таблицам Google Sheets.)

во-первых, все остальные ответы в значительной степени устарели или будут, либо потому, что они используют старый антивируса Avast ("Данные Google ") Протокол, ClientLogin или AuthSub, все из которых были осуждены. То же самое верно для всех кодов или библиотек, использующих Google Sheets API v3 или старше.

современный доступ к API Google происходит с помощью ключей API (общедоступные данные) или авторизации OAuth2 (авторизованные данные), в первую очередь с Клиентские Библиотеки Google APIs, включая один для Python. (И нет, вам не нужно создавать всю систему auth просто для доступа к API... см. blogpost ниже.)

для выполнения запрошенных в/в ОП, вам нужно authorzed доступ к Google Drive API, возможно, для запроса конкретных листов для загрузки, а затем для выполнения фактического экспорта(ов). Поскольку это, вероятно, обычная операция, я написал blogpost общий фрагмент кода, который делает это для вас. Если вы хотите продолжить это еще больше, у меня есть еще одна пара посты вместе с видео, в котором описывается, как загружать файлы и загружать файлы с Google Диска.

обратите внимание, что есть также более новый Google Таблицы API v4, но это в первую очередь для операции, ориентированные на электронные таблицы, т. е. вставка данных, чтение строк электронных таблиц, форматирование ячеек, создание диаграмм, добавление сводных таблиц и т. д. не запрос как экспорт, где API диска является правильным для использования.

чтобы увидеть пример экспорт листа Google как CSV с диска, проверьте этот блог я написал; чтобы узнать больше об использовании Google таблиц с Python, см. этот ответ я писал для аналогичного вопроса.

Если вы совершенно новичок в Google APIs, то вам нужно сделать еще один шаг назад и сначала просмотреть эти видео:


следующий код работает в моем случае (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

Я еще больше упростил ответ @Cameron, удалив ненужную ориентацию объекта. Это делает код меньше и проще для понимания. Я также отредактировал url-адрес, который может работать лучше.

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

Это не полный ответ, но Андреас Калер написал интересное решение CMS с помощью Google Docs + Google App Engline + Python. Не имея никакого опыта в этой области, я не вижу, какая часть кода может быть вам полезна, но проверьте это. Я знаю, что он взаимодействует с учетной записью Google Docs и играет с файлами, поэтому у меня такое чувство, что вы узнаете, что происходит. Следует по крайней мере указать вам в правильном направлении.

Google AppEngine + Google Docs + некоторые Python = простая CMS


Gspread действительно является большим улучшением по сравнению с GoogleCL и Gdata (оба из которых я использовал и, к счастью, отказался в пользу Gspread). Я думаю, что этот код даже быстрее, чем предыдущий ответ, чтобы получить содержимое листа:

username = 'sdfsdfsds@gmail.com'
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)

(16 декабря) попробуйте другую библиотеку я написал:pygsheets. Он похож на gspread, но использует Google api v4. У него есть export метод экспорта электронной таблицы.

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)