首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将google sheets API调用更改为批处理

将google sheets API调用更改为批处理
EN

Stack Overflow用户
提问于 2021-03-13 06:54:22
回答 1查看 101关注 0票数 0

第一次使用google(和所有) api调用时,尽管限制了速率,但我仍然不断地达到速率限制阈值。如何将以下代码更改为批处理格式以避免这种情况?

代码语言:javascript
复制
#API Call Function
from ratelimit import limits, sleep_and_retry
import requests
from googleapiclient.discovery import build
@sleep_and_retry
@limits(calls=1, period=4.5)
def pull_sheet_data(SCOPE,SPREADSHEET_ID,DATA_TO_PULL):
    creds = gsheet_api_check(SCOPE)
    service = build('sheets', 'v4', credentials=creds)
    sheet = service.spreadsheets()
    result = sheet.values().get(
        spreadsheetId=SPREADSHEET_ID,
        range=DATA_TO_PULL).execute()
    values = result.get('values', [])
    
    if not values:
        print('No data found.')
    else:
        rows = sheet.values().get(spreadsheetId=SPREADSHEET_ID,
                                  range=DATA_TO_PULL).execute()
        data = rows.get('values')
        print("COMPLETE: Data copied")
        return data

#list files in the active brews folder
activebrews = drive.ListFile({'q':"'0BxU70FB_wb-Da0x5amtYbUkybXc' in parents"}).GetList()
tabs = ['Brew Log','Fermentation Log','Centrifuge Log']

brewsheetdict ={}
#Pulls data from the entire spreadsheet tab.

    
        
for i in activebrews:
    for j in tabs:
        #set spreadsheet parameters
        SCOPE = ['https://www.googleapis.com/auth/drive.readonly']
        SPREADSHEET_ID = i['id']
        data = pull_sheet_data(SCOPE,SPREADSHEET_ID,j)
        dftitle = str(i['title'])
        dftab = str(j)
        dfname = dftitle+'_'+dftab
        brewsheetdict[dfname] = pd.DataFrame(data)

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-03-16 08:46:30

多亏了Tanaike的建议,我决定采用以下解决方案。还有一些我还没有解决的问题。也就是说,最终的API调用以每秒0.5次的速度发生,远远低于发布的限制,但任何更快的速度仍然会导致速率限制问题。此外,每次在列表的一半上执行for循环后完成的代码,需要重复执行。为了解决第二个问题,我包含了指定的行,用于在迭代列表项之后删除它们,因此每次重新运行代码时都会从最后一条不完整的记录开始。

代码语言:javascript
复制
import time    
        
SCOPE = ['https://www.googleapis.com/auth/drive.readonly']
recordcount=0
#if (current - start)/(recordcount) >= 1:
sleeptime=2.2
start=time.time()
for i in activebrews:
    SPREADSHEET_ID = i['id']
    for j in tabs:
        data = pull_sheet_data(SCOPE,SPREADSHEET_ID,j)
        dftitle = str(i['title'])
        dftab = str(j)
        dfname = dftitle+'_'+dftab
        brewsheetdict[dfname] = pd.DataFrame(data)
        recordcount+=1
        time.sleep(sleeptime)
        end=time.time()
        print(recordcount,dfname, (end-start)/recordcount)
    activebrews.remove(i)#remove list item after iterated over
    time.sleep(1)
 
brewsheetdata = open("brewsheetdata.pkl","wb")
pickle.dump(brewsheetdict,brewsheetdata)
brewsheetdata.close()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66608283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档