You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助Google Drive API实现关联云端硬盘的大规模按年份重组?

用Google Drive API实现大规模云端硬盘重组方案

完全可以通过Google Drive API实现这种大规模重组,而且效率远高于手动操作——因为API移动文件只是修改元数据,无需复制实际文件内容,对大文件友好。以下是落地的具体方案:

核心逻辑

  1. 遍历所有按字母分类的源云端硬盘,批量获取文件的元数据(创建/修改时间、父文件夹、权限等)
  2. 从文件时间字段提取年份,作为分类依据
  3. 在目标年份分类的云端硬盘中,创建对应年份的文件夹结构(如果不存在)
  4. 批量将文件从源位置移动到目标年份文件夹下

关键步骤与代码示例(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:35:23