Burnash的Google电子表格API库gspread的异步包装

gspread-asyncio的Python项目详细描述


gspread_asyncio

一个用于burnash's excellent Google Spreadsheet API libraryasyncio wrappergspread_asyncio不仅仅是gspreadapi周围的一个简单的异步包装器,它在这些api之上实现了一些有用和有用的特性。它对于长时间运行的进程和一次性脚本很有用。

需要python>;=3.5,因为它使用异步/等待语法。

Documentation StatusBuild Status

功能

  • 完成gspreadapi的异步包装。所有的gspreadapi调用都是从线程池执行器中的主线程运行的。
  • 内部缓存和重用gspreadClient/Spreadsheet/Worksheet对象。
  • 自动续订过期凭据。
  • 从google服务器(http 5xx)自动重试虚假故障。
  • 自动速率限制,默认设置为google的默认api限制。
  • 许多不需要返回值的方法可以有选择地返回已调度的Future(即nowaitKwarg)。您可以忽略这一未来,允许在异步事件循环为您安排并在稍后运行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的有效身份验证凭据集。
  • 您应该在应用程序中存储的唯一对象是AsyncioGspreadClientManageragcm)。
  • Spreadsheet.title属性进行I/O的地方有一个bug in the underlying gspread library。我认为应该在gspread层修复这个问题,但是在那之前,在访问.title属性时,可能会遇到API调用失败的问题。
  • 现在gspread库不支持行的批量追加或单元格的批量更改。完成后,gspread_asyncio将支持这些google api调用的批处理,而不需要对pythongspread_asyncioapi进行任何更改。
  • 经过大量的实验,我得出了api调用之间默认的1.1秒延迟(即gspread_delaykwarg)。官方的api速率限制是每秒一次调用,但是google测量这些东西会引入一个微小的抖动,如果你严格遵守这个限制,就会导致你的速率被阻塞。
  • 谷歌在这些端点上的服务可靠性出人意料地差。有频繁的http 500s和重试逻辑将节省您的屁股在长时间运行的脚本或短,一次性,一次性的。
  • 实验还发现,谷歌的证书在一小时后到期,默认的45分钟就可以了。

许可证

麻省理工学院

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
具有x86javapath的x64机器上x86java上的java JNI未满足链接错误   java将Pixmap的一部分上传到GPU   图像Java位图RLE8格式   java Android studio谷歌广告崩溃应用程序   java如何创建包含未知数量对象的变量?   Java计算给定int数组的所有可能组合   java JDBC classnotfound异常   httpclient中的java将HttpEntity转换为字符串的最优雅/正确的方法是什么?   如何从Java程序运行nano?   java在安卓中调用自定义类/方法   调用方法和JOptionPane后,允许代码继续执行所需的java计时器或其他想法   关于侦听器的向量Java并发问题   线程池执行器Java线程池   java配置DTO上的Swagger javax验证约束   Java中用于按钮功能的swing操作命令   ServletOutputStream中的java设置状态代码   java打印输入数组的平均值