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

Python操作Google Drive上传CSV新文件触发索引越界问题

问题根因

报错来自三处逻辑缺陷:

  1. getSpreadsheetId函数查询不到云端同名文件时,直接调用exit()终止了整个脚本运行,完全无法执行后续新文件上传流程
  2. 文件名处理用split(".")后直接取索引1判断后缀的写法鲁棒性差,遇到带多个点的文件名、无后缀文件时会直接触发列表索引越界
  3. 没有做存量文件存在性判断,不管查没查到旧文件ID都会强行执行删除操作,查不到ID时自然触发索引越界错误
修复后可直接运行的代码
import gspread
import os
from googleapiclient.discovery import build

gc = gspread.oauth(credentials_filename='/users/user/credentials.json')
service = build("drive", "v3", credentials=gc.auth)
folder_id = '1z_pUvZyt5AoTNy-aKCKLmlNjdR2OPo'

def getSpreadsheetId(filename):
    q = f"name='{filename}' and mimeType='application/vnd.google-apps.spreadsheet' and trashed=false"
    res = service.files().list(
        q=q,
        fields="files(id)",
        corpora="allDrives",
        includeItemsFromAllDrives=True,
        supportsAllDrives=True
    ).execute()
    items = res.get("files", [])
    if not items:
        print(f"未找到云端同名表格{filename},跳过删除步骤")
        return None
    return items[0]["id"]

os.chdir('/users/user/CSVtoGD2')
files = os.listdir()

for filename in files:
    # 安全拆分文件名和后缀,避免文件名带多个点时触发索引越界
    fname, ext = os.path.splitext(filename)
    if ext.lower() != ".csv":
        continue
    # 查询云端旧文件ID
    oldSpreadsheetId = getSpreadsheetId(fname)
    # 仅当查到匹配的旧文件时才执行删除
    if oldSpreadsheetId:
        gc.del_spreadsheet(oldSpreadsheetId)
    # 无论是否存在旧文件,都执行新文件上传流程
    sh = gc.create(fname, folder_id)
    with open(filename, "rb") as f:
        content = f.read()
    gc.import_csv(sh.id, content)
核心修改点说明
  • 调整getSpreadsheetId返回逻辑:查不到云端同名文件时不再终止整个脚本,仅返回None并打印提示
  • 增加删除前置判断:只有获取到有效的旧表格ID时才执行删除操作,本地新增的未上传文件直接跳过删除步骤
  • 替换文件名后缀判断逻辑:用标准库os.path.splitext拆分文件名和后缀,兼容带多个点的文件名(例如销售数据.202405.csv),从根源避免列表索引越界
  • 优化文件读取写法:用with上下文管理器管理文件句柄,避免文件资源泄漏
  • 把固定不变的folder_id移出循环,避免无意义的重复赋值

内容的提问来源于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 13:12:18