ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-从Dropbox API构建目录树

2019-10-12 11:59:53  阅读:268  来源: 互联网

标签:python dropbox


我想做的是使用python绑定从Dropbox API为给定路径构建树,并为每个路径共享链接.

我建议的结构如下所示:

[
    {
        'path': '/a',
        'is_dir': True,
        'contents': [
            {
                'path': '/a/b',
                'is_dir': True,
                'contents': [etc]
            },
            {
                'path': '/a/readme.txt',
                'is_dir': False,
                'share_link': 'http://etc'
            }
        ]
    },
    etc.
]

我有一些可以使用metadata()进行工作的东西,但是它慢得令人讨厌,因为它需要遍历每个目录进行API调用.

我想改用的是delta(),它将使我在一个请求中获得每个文件,然后将其构建到树中,但是我在弄清楚确切如何(尤其是如何将路径解析为树.

编辑:而且我已经意识到每个共享链接都有一个调用,因此我将忽略这些链接,并在需要时获取它们.

这是我到目前为止需要获得的数据的一些代码:

paths = []

for path, metadata in client.delta(path_prefix='/whatever')['entries']:
    paths.append({
        'path': path,
        'is_dir': metadata['is_dir']
    })

所以我想我很难弄清楚如何嵌套这些路径.可以肯定的是,我在这里需要一个递归函数,但不能完全弄清楚.

解决方法:

我稍微调整了一下您的结构…这是以下代码产生的JSON表示形式.请注意,我已将content字段设置为按路径而不是数组索引的字典.这稍微容易一点,并且可以提高查找效率,但是如果需要,可以很容易地将其转换为上面的内容:

{
    "is_dir": true,
    "contents": {
        "/foo.txt": {
            "is_dir": false,
            "contents": {}
        },
        "/a": {
            "is_dir": true,
            "contents": {
                "/a/bar.txt": {
                    "is_dir": false,
                    "contents": {}
                },
                "/a/b": {
                    "is_dir": true,
                    "contents": {
                        "/a/b/hello.txt": {
                            "is_dir": false,
                            "contents": {}
                        }
                    }
                }
            }
        }
    }
}

这是产生该输出的代码:

ACCESS_TOKEN = '<REDACTED>'

from collections import defaultdict
import json

from dropbox.client import DropboxClient

def make_tree():
    return {
        'is_dir': True,
        'contents': defaultdict(make_tree)
    }
tree = defaultdict(make_tree)

client = DropboxClient(ACCESS_TOKEN)

has_more = True
cursor = None

while has_more:
    delta = client.delta(cursor)

    cursor = delta['cursor']
    has_more = delta['has_more']

    for path, metadata in delta['entries']:
        if metadata is not None:

            # find the right place in the tree
            segments = path.split('/')
            location = tree['/']
            for i in xrange(1, len(segments)-1):
                current_path = '/'.join(segments[:i+1])
                location = location['contents'][current_path]

            # insert the new entry
            location['contents'][path] = {
                'is_dir': metadata['is_dir'],
                'contents': {}
            }

print json.dumps(tree['/'], indent=4)

标签:python,dropbox
来源: https://codeday.me/bug/20191012/1900157.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有