Burnash的Google电子表格API库gspread的异步包装
gspread-asyncio的Python项目详细描述
gspread_asyncio
一个用于burnash's excellent Google Spreadsheet API library的asyncio wrapper。gspread_asyncio
不仅仅是gspread
api周围的一个简单的异步包装器,它在这些api之上实现了一些有用和有用的特性。它对于长时间运行的进程和一次性脚本很有用。
需要python>;=3.5,因为它使用异步/等待语法。
功能
- 完成
gspread
api的异步包装。所有的gspread
api调用都是从线程池执行器中的主线程运行的。 - 内部缓存和重用
gspread
Client
/Spreadsheet
/Worksheet
对象。 - 自动续订过期凭据。
- 从google服务器(http 5xx)自动重试虚假故障。
- 自动速率限制,默认设置为google的默认api限制。
- 许多不需要返回值的方法可以有选择地返回已调度的
Future
(即nowait
Kwarg)。您可以忽略这一未来,允许在异步事件循环为您安排并在稍后运行google spreadsheet api调用时在调用coroutine上向前推进。
示例用法
import asyncio
import gspread_asyncio
from oauth2client.service_account import ServiceAccountCredentials
async def run(agcm):
agc = await agcm.authorize()
ss = await agc.create('Test Spreadsheet')
print('Spreadsheet URL: https://docs.google.com/spreadsheets/d/{0}'.format(ss.id))
await agc.insert_permission(ss.id, None, perm_type='anyone', role='writer')
ws = await ss.add_worksheet('My Test Worksheet', 10, 5)
zero_ws = await ss.get_worksheet(0)
for row in range(1,11):
for col in range(1,6):
val = '{0}/{1}'.format(row, col)
await ws.update_cell(row, col, val+" ws")
await zero_ws.update_cell(row, col, val+" zero ws")
await asyncio.sleep(30)
agcm.loop.stop()
def get_creds():
return ServiceAccountCredentials.from_json_keyfile_name('serviceacct_spreadsheet.json',
['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/spreadsheets'])
agcm = gspread_asyncio.AsyncioGspreadClientManager(get_creds)
loop = asyncio.get_event_loop()
loop.set_debug(True)
loop.create_task(run(agcm))
loop.run_forever()
观察笔记和问题
- 此模块不定义自己的异常,它传播
gspread.exceptions.GSpreadException
的实例。 - 在处理电子表格之前,请始终调用
AsyncioGspreadClientManager.authorize()
、AsyncioGspreadClient.open_*()
和AsyncioGspreadSpreadsheet.get_worksheet()
。这些方法保留一个内部缓存,因此多次调用它们(即使在循环内)也不费力。这确保您始终拥有来自google的有效身份验证凭据集。 - 您应该在应用程序中存储的唯一对象是
AsyncioGspreadClientManager
(agcm
)。 - 在
Spreadsheet.title
属性进行I/O的地方有一个bug in the underlying gspread library。我认为应该在gspread层修复这个问题,但是在那之前,在访问.title
属性时,可能会遇到API调用失败的问题。 - 现在
gspread
库不支持行的批量追加或单元格的批量更改。完成后,gspread_asyncio
将支持这些google api调用的批处理,而不需要对pythongspread_asyncio
api进行任何更改。 - 经过大量的实验,我得出了api调用之间默认的1.1秒延迟(即
gspread_delay
kwarg)。官方的api速率限制是每秒一次调用,但是google测量这些东西会引入一个微小的抖动,如果你严格遵守这个限制,就会导致你的速率被阻塞。 - 谷歌在这些端点上的服务可靠性出人意料地差。有频繁的http 500s和重试逻辑将节省您的屁股在长时间运行的脚本或短,一次性,一次性的。
- 实验还发现,谷歌的证书在一小时后到期,默认的45分钟就可以了。
许可证
麻省理工学院