返回

Python从零搭建Google Drive管理系统

见解分享

无需强调,Google Drive 在整个存储市场中已经扮演着举足轻重的角色。从学术界到工商界,各行各业的人们都用 Google Drive 分享或存储文件。对于个人用户,它是一种安全便捷的在线存储工具,可以存储大量文件以供自己或团队使用。

如果您想从数据科学的角度,充分利用 Google Drive 的优势,那么就必须把 Python 当作自己的盟友。Python 拥有非常丰富的库,其中就包括与 Google Drive 集成的库,例如:

  • PyDrive
  • gspread
  • google-auth

有了这些库,您就可以轻松实现以下功能:

  • 创建、复制、上传、下载、移动、重命名和删除文件
  • 建立文件目录树
  • 与他人共享文件
  • 搜索文件
  • 将文件转换为其他格式

本文将重点介绍如何使用 Python 来管理 Google Drive 文件,如果您想了解更多有关数据科学的其他方面的内容,可以参考我的其他文章,比如:

先决条件

在开始之前,您需要确保已经安装了以下软件:

  • Python 3
  • Pip
  • Google Drive SDK

如果您还没有安装这些软件,请按照以下步骤进行操作:

  1. 安装 Python 3:前往 Python 官网下载并安装 Python 3。
  2. 安装 Pip:使用以下命令安装 Pip:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
  1. 安装 Google Drive SDK:使用以下命令安装 Google Drive SDK:
pip install --upgrade google-auth google-auth-oauthlib google-api-python-drive

使用 Python 管理 Google Drive 文件

现在,您已经安装了必要的软件,就可以开始使用 Python 管理 Google Drive 文件了。

首先,您需要创建一个 Google Drive 服务对象。您可以使用以下代码来创建服务对象:

from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def drive_service():
    """Shows basic usage of the Drive v2 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    service = build('drive', 'v2', credentials=creds)
    return service


if __name__ == '__main__':
    service = drive_service()
    # Call the Drive v2 API
    files = service.files().list(
        pageSize=10, fields="nextPageToken, items(id, name)").execute()
    print('Files:')
    for file in files.get('items', []):
        print(f'{file.get("name")}, {file.get("id")}')

运行以上代码,您将看到如下输出:

Files:
Untitled spreadsheet, 1zoR8UyEkU9SMnjniGQx_gYLZgzoBwb6vvREc8nrsT1Q
Untitled spreadsheet, 1zY96N-CcdvZ_oBLvjg6f3LLexzL4whFbdHNfGgnEFks
Untitled spreadsheet, 1Isygw9mqi7E4yTX24iMRLGB-h-u3_9Ri3XFvXrBH7wo
Untitled spreadsheet, 1zkp7uFa66mXR4-lMoCMiMx_QGFWR3FT4b1Jtyi_ERfg
Untitled spreadsheet, 1OC0gdFpy8C9GYtIu0Se0q12hbhYJ4Ef5G298H3sWFIY
Untitled spreadsheet, 19Fl4PDjGTHunK8Hy-FvypqVMRi660d2B6X2PUo1wU6s
Untitled spreadsheet, 1lWWnC5iJ6Kd2eYAm9V_AljUr-Pfwtb5tUYiwYSE1gPM
Untitled spreadsheet, 1YB6jM12t3X7-pN_nnPWmd8bBxVu2XjyUmzl14p4gdDA
Untitled spreadsheet, 1z4k3dmX8KKjxa73HNnYYt25M-1STFT15lDg8Iu84YaA
Untitled spreadsheet, 1tl3_Yq2vKUX6f43cmg1vjbBt3E_7wl_q-u7y-r5AtjA

以上输出显示了用户的前 10 个 Google Drive 文件的名称和 ID。

创建文件

您可以使用以下代码来创建文件:

from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def drive_create_file(file_metadata, file_content):
    """Create new File.

    Args:
        file_metadata: metadata of file to be created.
        file_content: content of the file to be created.

    Returns:
        created file metadata.
    """
    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    service = build('drive', 'v2', credentials=creds)

    try:
        file_metadata['mimeType'] = 'text/plain'
        file = service.files().insert(
            body=file_metadata,
            media_body=file_content).execute()
        print(F'File ID: {file.get("id")}')
        return file
    except HttpError as error:
        print(F'An error occurred: {error}')
        return None


if __name__ == '__main__':
    file_metadata = {
        'name': 'my-new-file',
        'parents': ['1BlR6PUJ8Bg-taekBQfwFPN1PeKPJ433j']
    }
    file_content = 'Hello, world!'
    drive_create_file(file_metadata, file_content)

运行以上代码,您将在根目录下创建一个名为“my-new-file”的新文件。

上传文件

您可以使用以下代码来上传文件:

from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def drive_upload_file(filepath, mimetype, file_metadata):
    """Upload a File.

    Args:
        filepath: path to the file to upload.
        mimetype: mime type of the file to upload.
        file_metadata: metadata of the file to be uploaded.

    Returns:
        uploaded file metadata.
    """
    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    service = build('drive', 'v2', credentials=creds)

    try:
        file_metadata['mimeType'] = mimetype
        media = googleapiclient.http.MediaFileUpload(filepath,
                                                   mimetype=mimetype)
        file = service.files().insert(
            body=file_metadata,
            media_body=media,
            fields='id').execute()
        print(F'File ID: {file.get("id")}')
        return file
    except HttpError as error:
        print(F'An error occurred: {error}')
        return None


if __name__ == '__main__':
    filepath = 'path/to/file.txt'
    mimetype = 'text/plain'
    file_metadata = {
        'name': 'my-uploaded-file',
        'parents': ['1BlR6PUJ8Bg-taekBQfwFPN1PeKP