
本文介绍如何正确使用 Google Cloud 服务账户凭据(credentials.json)通过 Python 的 Google API 客户端库下载 Google Drive 中的指定文件,重点解决因凭据加载错误导致的 AttributeError: 'set' object has no attribute 'keys' 问题。
本文介绍如何正确使用 google cloud 服务账户凭据(credentials.json)通过 python 的 google api 客户端库下载 google drive 中的指定文件,重点解决因凭据加载错误导致的 `attributeerror: 'set' object has no attribute 'keys'` 问题。
在使用服务账户访问 Google Drive API 时,一个常见却容易被忽略的错误是:将 credentials.json 文件误当作 Python 字面量(如集合 {...})直接赋值给变量,而非解析为字典对象。原始代码中 credz = {"credentials.json"} 创建的是一个仅含字符串的 set(集合),而 service_account.Credentials.from_service_account_info() 方法严格要求传入一个包含完整服务账户密钥字段(如 type, project_id, private_key, client_email 等)的字典(dict)。当方法尝试调用 data.keys() 时,因输入是 set 类型而抛出 AttributeError。
✅ 正确做法是使用 json.load() 读取并解析 JSON 文件内容:
import json
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload
from google.oauth2 import service_account
import io
# ✅ 正确加载服务账户凭据:读取 JSON 文件并解析为字典
with open("credentials.json", "r", encoding="utf-8") as f:
credz = json.load(f)
credentials = service_account.Credentials.from_service_account_info(
credz,
scopes=["https://www.googleapis.com/auth/drive.readonly"] # 显式声明最小必要权限
)
drive_service = build("drive", "v3", credentials=credentials)
# 指定待下载文件的 ID(确保该文件已对服务账户邮箱(client_email)共享,权限为 "reader")
file_id = "your_file_id_here" # 替换为实际的文件 ID
# 构建媒体下载请求
request = drive_service.files().get_media(fileId=file_id)
# 方式1:下载到磁盘(推荐用于大文件)
fh = io.FileIO("downloaded_file.zip", "wb")
downloader = MediaIoBaseDownload(fh, request)
# 方式2:下载到内存(适用于小文件,便于后续处理)
# fh = io.BytesIO()
# downloader = MediaIoBaseDownload(fh, request)
done = False
while not done:
status, done = downloader.next_chunk()
if status:
print(f"Download {int(status.progress() * 100)}%")
print("✅ 下载完成!")⚠️ 关键注意事项:
-
权限配置:服务账户本身不拥有 Drive 文件——你必须在 Google Drive 网页端右键目标文件 → “共享” → 添加服务账户的
client_email(形如xxx@xxx.iam.gserviceaccount.com),并授予“查看者”(Viewer)权限。否则会返回403 Forbidden。 - API 启用:确保已在 Google Cloud Console 中为对应项目启用了 Google Drive API。
-
作用域(Scopes):始终显式指定最小权限范围(如
drive.readonly),避免使用宽泛权限(如drive),提升安全性与审核通过率。 -
文件类型兼容性:此方法适用于任意可直接下载的文件(如
.zip,.pdf,.csv)。若需导出 Google Docs/Sheets 等原生格式,请改用export接口并指定mimeType(如text/csv)。 -
异常处理建议(生产环境必加):
try: # ... 下载逻辑 except Exception as e: print(f"❌ 下载失败:{e}") # 可添加日志记录、重试机制或通知逻辑
掌握凭据的正确加载方式与权限模型,是自动化集成 Google Drive 的基石。只要确保 JSON 解析无误、服务账户获授权、API 已启用,即可稳定实现服务端无人值守下载。
立即学习“Python免费学习笔记(深入)”;


















