代码之家  ›  专栏  ›  技术社区  ›  cacti5

使用Google Drive API移动文件

  •  5
  • cacti5  · 技术社区  · 8 年前

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

    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 回复  |  直到 8 年前
        1
  •  10
  •   cacti5    3 年前

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

        file_id = '***'
        folder_id = '***'
    
        # 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()
            
            if copy:
                previous_parents = ''
            else:
                previous_parents = ",".join(file.get('parents'))
    
            file = drive_service.files().update(
                fileId=file_id,
                addParents=folder_id,
                removeParents=previous_parents,
                fields='id, parents'
            ).execute()