You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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()

脚本关键说明

  1. 过滤与分页:通过q参数精准定位目标文件,pageSize=1000减少分页请求次数;循环处理nextPageToken确保获取全部文件
  2. 批量删除:使用BatchHttpRequest将多个删除请求合并为一次API调用,大幅提升处理速度
  3. 重试机制:依赖tenacity库实现指数退避重试(需先执行pip install tenacity安装),处理临时超时或限流问题
  4. 限流控制:批量删除后添加1秒延迟,避免触发Google Drive API的请求频率限制

内容的提问来源于stack exchange,提问作者user3264403

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:35:13