使用Python API表示Google Drive文件夹的文件和文件夹树

时间:2018-01-05 11:12:23

标签: python class google-drive-api

我想使用python类在嵌套的json树中列出google驱动器文件夹和文件。

我希望结构的每个数据点都应该是对象,我想在类

中包装整个脚本

树应该是这样的

[
{
"name":<folder_name>,
"id":<folder_id>,
"type":'folder',
 "children":[
        {
        "name":<folder_name>,
        "id":<folder_id>,
        "type":'folder',
         "children":[
         {
            "name":<folder_name>,
            "id":<folder_id>,
            "type":'folder',
             "children":[..........]
        },
        {
            "name":<file_name>,
            "id":<file_id>,
            "type":'file',
        }
        ]
        },
        {
        "name":<file_name>,
        "id":<file_id>,
        "type":'file',
        }
]
},
{
"name":<file_name>,
"id":<file_id>,
"type":'file',
},
......................
]

谢谢

4 个答案:

答案 0 :(得分:1)

你可以这样做,但你必须自己实施。

  1. 首先,获取具有rootFolder父级的文件。
  2. 获取文件后,检查它是否是文件夹。如果是,请检查它是否有文件。

    2.1将数据插入children属性

  3. 重复此过程,直到您成功列出所有文件。

  4. 参考文献:

    希望这有帮助。

答案 1 :(得分:0)

需要一些重构,但是可以。只需将值添加到dictionary,例如为每个元素添加x.name: x.make_dict()

import logging
import copy

import connect


logger = logging.getLogger('importer')


class DriveObj():

    def __init__(self, drive_obj):
        self.id = drive_obj.get('id')
        self.name = drive_obj.get('name')

    def make_dict(self):
        props = copy.deepcopy(vars(self))
        del props['name']
        return props

    @property
    def parents(self):
        try:
            return service.files().get(fileId=self.id,
                                       fields='parents').execute()['parents']
        except KeyError:
            return []


class Directory(DriveObj):

    def __init__(self, drive_obj):
        super().__init__(drive_obj)
        self.mimeType = 'application/vnd.google-apps.folder'
        assert drive_obj.get('mimeType') == self.mimeType, 'Not dir :('
        self.children = []

    def add_content(self, drive_obj):
        self.children.append(drive_obj)


class Document(DriveObj):

    def __init__(self, drive_obj):
        super().__init__(drive_obj)
        assert 'vnd.google-apps.folder' not in drive_obj.get('mimeType')
        self.mimeType = drive_obj.get('mimeType')


def get_filelist(service):
    return service.files().list().execute()


def get_content(service):
    content = list()
    for drive_obj in get_filelist(service)['files']:
        try:
            content.append(Directory(drive_obj))
        except AssertionError:
            content.append(Document(drive_obj))
    return content


def find_id(content, id):
    for drive_obj in content:
        logger.debug('Got {}'.format(drive_obj.id))
        if drive_obj.id == id:
            logger.debug('Find id in {}'.format(drive_obj.id))
            return drive_obj
        elif type(drive_obj) == Directory and drive_obj.children:
            logger.debug('{} has children'.format(drive_obj.id))
            result = find_id(drive_obj.children, id)
            if result:
                return result


def create_corr_structure(content):
    for obj in content:
        if obj.parents:
            for parent in obj.parents:
                parent_obj = find_id(content, parent)
                if parent_obj:
                    parent_obj.add_content(obj)
                else:
                    logger.debug(
                        'There is no parent directory for {}'.format(obj.name))
    content[:] = [value for value in content if not value.parents]


if __name__ == "__main__":
    structure = dict()
    service = connect.connect_drive()
    content = get_content(service)
    create_corr_structure(content)

答案 2 :(得分:0)

mymod

答案 3 :(得分:0)

通常,Google驱动器不是典型的树形结构(文件夹是标签,一个文件可以有多个父级)。

但是,我会考虑使用treelib之类的树可视化库。

以下是用于递归打印Google驱动器文件系统的完整解决方案。

PrescQIPPWebApp