Загрузите электронную таблицу из Документов Google, используя Python
Можете ли вы привести пример того, как загрузить электронную таблицу Документов Google, используя ее ключ и идентификатор листа (gid
)? Я не могу
Я исследовал версии 1, 2 и 3 API. Мне не повезло, я не могу понять их API-интерфейсы, похожие на ATOM, gdata.docs.service.DocsService._DownloadFile
Закрытый метод говорит, что я не авторизован, и я не хочу сам писать всю систему аутентификации Google Login. Я собираюсь нанести удар себе в лицо из-за разочарования.
У меня есть несколько таблиц, и я хочу получить к ним доступ следующим образом:
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()
похоже на работу. (Документы для 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
, как Download
кажется, дает только файлы PDF.
(Июль 2016 г.) Перефразируя текущую терминологию: " Как загрузить лист Google в формате CSV с Google Drive с помощью Python?". (Документы Google теперь относятся только к облачному текстовому процессору / текстовому редактору, который не обеспечивает доступ к таблицам Google Sheets.)
Во-первых, все остальные ответы в значительной степени устарели или будут устаревшими, потому что они используют старый протокол GData (" Данные Google"), ClientLogin или AuthSub, и все они устарели. То же самое относится ко всему коду или библиотекам, использующим API Google Sheets v3 или более ранней версии.
Современный доступ к API Google осуществляется с помощью ключей API (открытые данные) или авторизации OAuth2 (авторизованные данные), в первую очередь с клиентскими библиотеками API Google, в том числе для Python. (И нет, вам не нужно создавать целую систему аутентификации только для доступа к API-интерфейсам... см. Пост блога ниже.)
Для выполнения задачи, запрошенной в / OP, вам необходим авторизованный доступ к Google Drive API, возможно, для запроса конкретных листов для загрузки, а затем для выполнения фактического экспорта (-ов). Поскольку это, скорее всего, обычная операция, я написал пост в блоге, в котором есть фрагмент кода, который делает это для вас. Если вы хотите заняться этим еще больше, у меня есть еще пара постов вместе с видео, в котором рассказывается, как загружать файлы и загружать файлы с Google Диска.
Обратите внимание, что существует также более новый API Google Sheets v4, но он в основном предназначен для операций с электронными таблицами, т. Е. Для вставки данных, чтения строк электронной таблицы, форматирования ячеек, создания диаграмм, добавления сводных таблиц и т. Д., А не для запросов на основе файлов, таких как экспорт. где Drive API является правильным для использования.
Чтобы увидеть пример экспорта Google Листа в виде CSV из Drive, просмотрите этот пост в блоге, который я написал; чтобы узнать больше об использовании Google Sheets с Python, посмотрите ответ, который я написал для аналогичного вопроса.
Если вы совершенно не знакомы с API Google, вам нужно сделать еще один шаг назад и сначала просмотреть эти видео:
- Как использовать API Google и создавать проекты API - пользовательский интерфейс изменился, но концепции остались прежними
- Пошаговое руководство по коду авторизации (Python) - вы можете использовать любой поддерживаемый язык для доступа к API Google; если вы не используете Python, используйте его как псевдокод, чтобы помочь вам начать
- Перечислите свои файлы на Google Drive и напишите код глубокого погружения
(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)
Это больше не работает с gdata 2.0.1.4:
gd_client.SetClientLoginToken(spreadsheets_client.GetClientLoginToken())
Вместо этого вы должны сделать:
gd_client.SetClientLoginToken(gdata.gauth.ClientLoginToken(spreadsheets_client.GetClientLoginToken()))
Я еще больше упростил ответ @ Кэмерона, удалив ненужную ориентацию объекта. Это делает код меньше и легче для понимания. Я также отредактировал 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)
Следующий код работает в моем случае (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
Скачать электронную таблицу из Google doc довольно просто с помощью листов.
Вы можете следить за подробной документацией на
https://pypi.org/project/gsheets/
или следуйте инструкциям ниже. Я рекомендую прочитать документацию для лучшего освещения.
pip install gsheets
Войдите в Google Developers Console с учетной записью Google, к таблицам которой вы хотите получить доступ. Создайте (или выберите) проект и включите Drive API и Sheets API (в Google Apps API).
Перейдите в Учетные данные для своего проекта и создайте Новые учетные данные> Идентификатор клиента OAuth> типа Другое. В списке идентификаторов клиентов OAuth 2.0 нажмите Загрузить JSON для только что созданного идентификатора клиента. Сохраните файл как client_secrets.json в своем домашнем каталоге (каталоге пользователя).
Используйте следующий фрагмент кода.
from gsheets import Sheets
sheets = Sheets.from_files('client_secret.json')
print(sheets) # will ensure authenticate connection
s = sheets.get("{SPREADSHEET_URL}")
print(s) # will ensure your file is accessible
s.sheets[1].to_csv('Spam.csv', encoding='utf-8', dialect='excel') # will download the file as csv
Я использую это: curl 'https://docs.google.com/spreadsheets/d/1-lqLuYJyHAKix-T8NR8wV8ZUUbVOJrZTysccid2-ycs/gviz/tq?tqx=out:csv' на листе, предназначенном для всеобщего чтения.
Итак, вам понадобится версия curl для Python, если вы можете работать с общедоступными листами.
Если у вас есть лист с некоторыми вкладками, которые вы не хотите показывать, создайте новый лист и импортируйте диапазоны, которые вы хотите опубликовать, во вкладки на нем.
Это не полный ответ, но Андреас Калер написал интересное CMS-решение, используя Google Docs + Google App Engline + Python. Не имея никакого опыта в этой области, я не могу точно понять, какая часть кода может быть вам полезна, но посмотрите на это. Я знаю, что он взаимодействует с учетной записью Google Docs и воспроизводит файлы, поэтому у меня есть ощущение, что вы поймете, что происходит. Это должно, по крайней мере, указать вам в правильном направлении.
Google AppEngine + Google Docs + немного Python = простая CMS
(Март 2019, Python 3) Мои данные обычно не конфиденциальны, и я обычно использую формат таблицы, аналогичный CSV.
В таком случае можно просто publish to the web
лист, а затем использовать его как файл CSV на сервере.
(Один публикует его, используя 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)
G инок действительно является большим улучшением по сравнению с 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)