Python操作Google Drive上传CSV新文件触发索引越界问题
问题根因
报错来自三处逻辑缺陷:
getSpreadsheetId函数查询不到云端同名文件时,直接调用exit()终止了整个脚本运行,完全无法执行后续新文件上传流程- 文件名处理用
split(".")后直接取索引1判断后缀的写法鲁棒性差,遇到带多个点的文件名、无后缀文件时会直接触发列表索引越界 - 没有做存量文件存在性判断,不管查没查到旧文件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
相关产品推荐
相关产品推荐

