我想使用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',
},
......................
]
谢谢
答案 0 :(得分:1)
你可以这样做,但你必须自己实施。
获取文件后,检查它是否是文件夹。如果是,请检查它是否有文件。
2.1将数据插入children
属性
重复此过程,直到您成功列出所有文件。
参考文献:
希望这有帮助。
答案 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