如何用Python从Google Drive的SKU文件夹拉取最新xlsx文件
从Google Drive拉取最新Excel文件到Pandas并导出本地文件
为什么你之前用os/requests失败?
个人Google Drive的文件有权限校验,直接拼接普通URL访问会被拒绝,触发400/404错误:
- 404错误:你输入的
gid是Google Sheets专属参数,Excel文件没有这个字段,自然找不到资源 - 400错误:请求没有携带合法的权限凭证,Google服务器识别为无效请求
下面给两种实用方案,按需选择:
方案1:用gdown快速实现(适合单文件快速拉取)
如果只是手动获取最新文件ID来拉取,这个方法最省心:
- 安装依赖:
pip install gdown pandas openpyxl
- 把目标Excel文件设置为「知道链接的人可查看」,从共享链接里提取文件ID(比如链接
https://drive.google.com/file/d/12345abcXYZ/view里的12345abcXYZ) - 代码实现:
import gdown import pandas as pd # 替换成你的文件ID file_id = "12345abcXYZ" # 下载到临时路径 temp_file = gdown.download(id=file_id, quiet=False) # 读入Pandas DataFrame df = pd.read_excel(temp_file, engine="openpyxl") # 这里写你的数据转换逻辑 # 示例:删除空行 df = df.dropna(how="all") # 导出本地文件 df.to_excel("processed_data.xlsx", index=False) # 或者导出CSV # df.to_csv("processed_data.csv", index=False, encoding="utf-8-sig")
方案2:用Google Drive API自动获取最新文件(适合定期自动执行)
如果需要每两周自动遍历SKU文件夹、拉取最新Excel,必须用API实现:
前期准备
- 去Google Cloud Console创建项目,启用「Google Drive API」
- 创建服务账号,下载密钥JSON文件(命名为
service_account_key.json) - 把服务账号的邮箱(在密钥JSON里的
client_email字段)添加到SKU文件夹的共享成员,赋予「查看」权限
代码实现
from google.oauth2 import service_account from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseDownload import pandas as pd import io # 1. 认证服务账号 SCOPES = ["https://www.googleapis.com/auth/drive.readonly"] SERVICE_ACCOUNT_FILE = "service_account_key.json" creds = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES ) service = build("drive", "v3", credentials=creds) # 2. 查找SKU文件夹的ID folder_name = "SKU" results = service.files().list( q=f"name='{folder_name}' and mimeType='application/vnd.google-apps.folder'", fields="files(id, name)" ).execute() folder_id = results["files"][0]["id"] # 3. 获取文件夹内所有xlsx文件,按修改时间倒序排序 results = service.files().list( q=f"'{folder_id}' in parents and mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'", fields="files(id, name, modifiedTime)", orderBy="modifiedTime desc" ).execute() files = results.get("files", []) if not files: print("SKU文件夹里没有找到xlsx文件") else: # 取最新的文件 latest_file = files[0] print(f"找到最新文件:{latest_file['name']},修改时间:{latest_file['modifiedTime']}") # 4. 下载文件内容到内存 request = service.files().get_media(fileId=latest_file["id"]) fh = io.BytesIO() downloader = MediaIoBaseDownload(fh, request) done = False while done is False: status, done = downloader.next_chunk() # 5. 读入Pandas DataFrame fh.seek(0) df = pd.read_excel(fh, engine="openpyxl") # 数据转换逻辑(示例) df = df.drop_duplicates(subset="SKU编号") # 6. 导出本地文件 df.to_excel(f"latest_SKU_data.xlsx", index=False) # df.to_csv(f"latest_SKU_data.csv", index=False, encoding="utf-8-sig")
内容的提问来源于stack exchange,提问作者Karvin
相关产品推荐
相关产品推荐

