Загрузите электронную таблицу из 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, то вам нужно сделать еще один шаг назад и сначала просмотреть эти видео:
- как использовать Google APIs и создавать проекты API -- пользовательский интерфейс изменился, но концепции по-прежнему же
- Пошаговое Руководство кода шаблона авторизации (Python) -- вы можете использовать любой Поддерживаемый язык для доступа к Google APIs; если вы не делаете Python, используйте его как псевдокод, чтобы помочь вам начать
- список ваших файлов в Google Drive и код глубокого погружения в должности
следующий код работает в моем случае (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)