如何通过Google Drive API高效删除40万个指定空文件?
批量删除Google Drive中大量指定文件的优化方案
Google Drive根目录出现40万个名称包含“scripts100..”的空文件,手动全选删除不可行,原Python脚本逐个删除速度极慢且频繁触发超时,现提供以下优化方案:
核心优化方向
- 精准过滤目标文件:在文件列表请求中加入过滤条件,只获取名称包含“scripts100..”的文件,避免遍历所有文件,减少数据传输量
- 使用批量请求接口:通过Drive API的批量请求功能,一次请求处理多个文件删除操作,大幅减少API调用次数,提升效率
- 分页处理文件列表:处理分页标记
nextPageToken,确保能获取所有目标文件(40万文件必然分页返回) - 增加异常重试机制:针对超时、请求失败等异常自动重试,避免脚本中途终止
优化后的完整脚本
from Google import Create_Service from googleapiclient.http import BatchHttpRequest import time from tenacity import retry, stop_after_attempt, wait_exponential CLIENT_SECRET_FILE = "client_secret.json" API_NAME = "drive" API_VERSION = "v3" SCOPES = ["https://www.googleapis.com/auth/drive"] service = Create_Service(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES) def list_target_files(page_token=None): try: # 过滤名称包含"scripts100.."的文件,仅返回id字段减少数据量 results = service.files().list( q="name contains 'scripts100..'", fields="nextPageToken, files(id)", pageToken=page_token, pageSize=1000 # 每页最大返回1000条,降低分页次数 ).execute() return results.get('nextPageToken'), results.get('files', []) except Exception as e: print(f"获取文件列表出错: {e}") return None, [] @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def delete_batch(file_ids): try: batch = BatchHttpRequest() for file_id in file_ids: # 批量添加删除请求,回调函数输出结果 batch.add( service.files().delete(fileId=file_id), callback=lambda req_id, resp, exc: print(f"文件{req_id}: {'删除成功' if not exc else f'删除失败: {exc}'}") ) batch.execute() except Exception as e: print(f"批量删除请求出错: {e}") raise # 触发重试逻辑 def main(): page_token = None batch_size = 100 # 每批删除100个文件,可根据API限流情况调整 while True: page_token, files = list_target_files(page_token) if not files: break # 拆分文件ID列表为批量 file_ids = [f['id'] for f in files] for i in range(0, len(file_ids), batch_size): batch_ids = file_ids[i:i+batch_size] delete_batch(batch_ids) time.sleep(1) # 添加延迟避免触发API限流 if not page_token: break if __name__ == "__main__": main()
脚本关键说明
- 过滤与分页:通过
q参数精准定位目标文件,pageSize=1000减少分页请求次数;循环处理nextPageToken确保获取全部文件 - 批量删除:使用
BatchHttpRequest将多个删除请求合并为一次API调用,大幅提升处理速度 - 重试机制:依赖
tenacity库实现指数退避重试(需先执行pip install tenacity安装),处理临时超时或限流问题 - 限流控制:批量删除后添加1秒延迟,避免触发Google Drive API的请求频率限制
内容的提问来源于stack exchange,提问作者user3264403
相关产品推荐
相关产品推荐

