使用Google-Drive-API移动文件

时间:2016-11-21 17:16:33

标签: python google-api-client google-api-python-client

是否可以通过python的googleapiclient模块显式移动文件?我想创建以下函数,给定文件,原始路径和目标路径:

def move_file(service, filename, init_drive_path, drive_path, copy=False):
    """Moves a file in Google Drive from one location to another.

    service: Drive API service instance.
    filename (string): full name of file on drive
    init_drive_path (string): initial file location on Drive
    drive_path (string): the file path to move the file in on Drive
    copy (boolean): file should be saved in both locations

    Returns nothing.
    """

目前我通过手动下载文件然后将其重新上传到所需位置来执行此操作,但这对于大文件来说并不实用,无论如何它似乎都是一种解决方法。

Here's the documentation了解google-drive-api上提供的方法。

编辑请参阅以下解决方案:

1 个答案:

答案 0 :(得分:2)

Found it here.您只需要检索文件和文件夹ID,然后使用更新方法。如果要在旧文件夹中保留文件的副本,可以排除remove_parents参数

file_id = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ'
folder_id = '0BwwA4oUTeiV1TGRPeTVjaWRDY1E'
# Retrieve the existing parents to remove
file = drive_service.files().get(fileId=file_id,
                                 fields='parents').execute();
previous_parents = ",".join(file.get('parents'))
# Move the file to the new folder
file = drive_service.files().update(fileId=file_id,
                                    addParents=folder_id,
                                    removeParents=previous_parents,
                                    fields='id, parents').execute()

(注意我没有包含我的基本辅助函数_getFileId和_getFolderId)所以我的原始函数看起来像:

def move_file(service, filename, init_drive_path, drive_path, copy=False):
        """Moves a file in Google Drive from one location to another.

        service: Drive API service instance.
        'filename' (string): file path on local machine, or a bytestream
        to use as a file.
        'init_drive_path' (string): the file path the file was initially in on Google
        Drive (in <folder>/<folder>/<folder> format).
        'drive_path' (string): the file path to move the file in on Google
        Drive (in <folder>/<folder>/<folder> format).
        'copy' (boolean): file should be saved in both locations

        Returns nothing.
        """
    file_id = _getFileId(service, filename, init_drive_path)
    folder_id = _getFolderId(service, drive_path)

    if not file_id or not folder_id:
        raise Exception('Did not find file specefied: {}/{}'.format(init_drive_path, filename))

    file = service.files().get(fileId=file_id,
                                     fields='parents').execute()
    previous_parents = ",".join(file.get('parents'))
    if copy:
        previous_parents = ''

    file = service.files().update(fileId=file_id,
                                        addParents=folder_id,
                                        removeParents=previous_parents,
                                        fields='id, parents').execute()