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
相关产品推荐
相关产品推荐

