如何借助Google Drive API实现关联云端硬盘的大规模按年份重组?
用Google Drive API实现大规模云端硬盘重组方案
完全可以通过Google Drive API实现这种大规模重组,而且效率远高于手动操作——因为API移动文件只是修改元数据,无需复制实际文件内容,对大文件友好。以下是落地的具体方案:
核心逻辑
- 遍历所有按字母分类的源云端硬盘,批量获取文件的元数据(创建/修改时间、父文件夹、权限等)
- 从文件时间字段提取年份,作为分类依据
- 在目标年份分类的云端硬盘中,创建对应年份的文件夹结构(如果不存在)
- 批量将文件从源位置移动到目标年份文件夹下
关键步骤与代码示例(Python)
1. 环境与授权准备
- 登录Google Cloud Console,启用Google Drive API
- 创建服务账号,下载JSON密钥文件
- 在Google Workspace Admin控制台,授权服务账号访问所有源/目标云端硬盘(团队盘需开启「允许服务账号访问团队盘」)
- 安装依赖:
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib
2. 初始化Drive API服务
from google.oauth2 import service_account from googleapiclient.discovery import build from googleapiclient.errors import HttpError SCOPES = ['https://www.googleapis.com/auth/drive'] SERVICE_ACCOUNT_FILE = 'your-service-account-key.json' credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) service = build('drive', 'v3', credentials=credentials)
3. 遍历源硬盘文件
def list_files_in_drive(drive_id): files = [] page_token = None while True: try: response = service.files().list( corpora='drive', driveId=drive_id, includeItemsFromAllDrives=True, supportsAllDrives=True, pageSize=1000, fields='nextPageToken, files(id, name, createdTime, parents)', pageToken=page_token ).execute() files.extend(response.get('files', [])) page_token = response.get('nextPageToken', None) if page_token is None: break except HttpError as error: print(f'获取文件列表失败: {error}') break return files
4. 创建目标年份文件夹
def get_or_create_year_folder(target_drive_id, year): # 检查目标硬盘是否已存在对应年份文件夹 query = f"'{target_drive_id}' in parents and name='{year}' and mimeType='application/vnd.google-apps.folder' and trashed=false" response = service.files().list( corpora='drive', driveId=target_drive_id, includeItemsFromAllDrives=True, supportsAllDrives=True, q=query, fields='files(id)' ).execute() folders = response.get('files', []) if folders: return folders[0]['id'] # 不存在则创建 folder_metadata = { 'name': year, 'mimeType': 'application/vnd.google-apps.folder', 'parents': [target_drive_id] } folder = service.files().create( body=folder_metadata, supportsAllDrives=True, fields='id' ).execute() return folder['id']
5. 批量移动文件
def move_file(file_id, new_parent_id): try: # 获取文件当前父文件夹 file = service.files().get( fileId=file_id, supportsAllDrives=True, fields='parents' ).execute() previous_parents = ','.join(file.get('parents', [])) # 替换父文件夹实现移动 service.files().update( fileId=file_id, supportsAllDrives=True, addParents=new_parent_id, removeParents=previous_parents, fields='id, parents' ).execute() return True except HttpError as error: print(f'移动文件 {file_id} 失败: {error}') return False
注意事项
- 配额限制:Drive API有每日请求配额(默认100000次),使用批量请求(
batch()方法)可以减少调用次数,避免触发限制 - 权限校验:确保服务账号对源硬盘有「读取」权限,对目标硬盘有「编辑」权限;如果是共享文件,需确认文件所有者允许移动
- 错误重试:对网络波动、权限异常等错误添加重试机制,建议用
tenacity库实现 - 日志记录:记录所有操作的成功/失败状态,方便后续排查问题
- 测试先行:先选取一个小容量的字母硬盘做测试,验证分类逻辑和移动流程无误后再大规模执行
内容的提问来源于stack exchange,提问作者piptheintern
相关产品推荐
相关产品推荐

