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

Python调用Google Drive API清空指定文件夹后上传CSV问题修复

问题根因

原有脚本报错核心是两个逻辑缺陷:

  • getSpreadsheetId函数匹配不到云端同名文件时直接调用exit()终止整个脚本,后续文件无法处理
  • 删除逻辑未做文件ID有效性校验,传入空值或无效ID调用删除/上传接口时就会触发404错误
    按照「先清空目标文件夹全量旧文件,再上传本地所有CSV」的逻辑调整后,可以完全规避这类匹配类错误,实现逻辑也更简单。
修复后完整代码
import gspread
import os
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload

gc = gspread.oauth(credentials_filename='/users/user/credentials.json')
service = build("drive", "v3", credentials=gc.auth)
folder_id = '19vrbvaeDqWcxFGwPV82APWYTmBME'  

def clear_target_folder(folder_id):
    """清空指定Google Drive文件夹下所有未移入回收站的文件"""
    page_token = None
    while True:
        # 拉取当前页文件列表
        query = f"'{folder_id}' in parents and trashed=false"
        res = service.files().list(
            q=query,
            fields="nextPageToken, files(id, name)",
            corpora="allDrives",
            includeItemsFromAllDrives=True,
            supportsAllDrives=True,
            pageToken=page_token
        ).execute()
        file_list = res.get("files", [])
        # 逐个删除文件
        for file in file_list:
            try:
                service.files().delete(
                    fileId=file["id"],
                    supportsAllDrives=True
                ).execute()
                print(f"已删除旧文件: {file['name']} (ID: {file['id']})")
            except Exception as e:
                print(f"删除文件 {file['name']} 失败,错误信息: {str(e)}")
        # 处理分页,直到所有文件拉取完成
        page_token = res.get("nextPageToken")
        if not page_token:
            break

def upload_csv_to_gd(filename, filePath):
    """上传本地CSV文件转换为Google Sheets格式存入指定文件夹"""
    file_metadata = {
        "name": filename,
        "parents": [folder_id],
        "mimeType": "application/vnd.google-apps.spreadsheet",
    }
    media = MediaFileUpload(os.path.join(filePath, f"{filename}.csv"), mimetype="text/csv")
    file = service.files().create(body=file_metadata, media_body=media, fields="id").execute()
    print(f"文件 {filename} 上传完成,文件ID: {file.get('id')}")

if __name__ == "__main__":
    filePath = '/users/user/CSVtoGD'
    # 第一步:清空目标文件夹所有旧文件
    clear_target_folder(folder_id)
    # 第二步:遍历本地文件夹上传所有CSV
    os.chdir(filePath)
    for filename in os.listdir():
        # 拆分文件名和后缀,兼容带多个.的文件名
        fname, ext = os.path.splitext(filename)
        if ext.lower() == ".csv":
            upload_csv_to_gd(fname, filePath)
关键调整说明
  • 新增分页拉取逻辑:Google Drive的files.list接口默认单页最多返回100条文件,分页循环可以保证文件夹内文件数量较多时也能全部清空,不会漏删
  • 移除了原有的同名文件匹配、遇新文件直接退出的逻辑,先清空再上传的流程完全避免了文件名匹配带来的ID无效问题
  • 调整了文件名拆分逻辑,用os.path.splitext替代原来的split("."),如果CSV文件名本身带.(比如data.202405.csv)也能正常识别
  • 保留了原脚本验证可用的CSV转Sheets上传逻辑,不需要额外适配
  • 新增了删除、上传操作的日志输出,运行时可以直接看到执行进度和错误信息

注意:运行前请确认你使用的授权账号对目标Google Drive文件夹有「删除文件」「编辑内容」的权限,否则会抛出403权限错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:39:12