使用python api递归计算每个Dropbox文件夹大小

时间:2013-11-29 10:35:57

标签: python file dropbox dropbox-api

编辑:我想计算每个文件夹大小而不仅仅是整个保管箱大小......我的代码在整个保管箱尺寸下工作正常

我很难使用python api计算Dropbox的每个文件夹大小 dropbox将文件夹大小返回为零

这是我的代码到目前为止,但它给了我错误的答案

  def main(dp_path):
   a=  client.metadata(dp_path)
   size_local = 0
   for x in a['contents']:
     if x['is_dir']==False:
       global size
       size += int(x['bytes'])
       size_local += int(x['bytes'])

       #print "Total size so far :"+str(size/(1024.00*1024.00))+" Mb..." 


     if x['is_dir']==True:
       a = main(str(x['path']))
       print str(x['path'])+" size=="+str(a/(1024.00*1024.00))+" Mb..."

     return size_local+size


 if __name__ == '__main__':
   global size
   size=0
   main('/')
   print str(size/(1024.00*1024.00))+" Mb" 

1 个答案:

答案 0 :(得分:4)

编辑2 :我似乎误解了这个问题。这里的代码打印出每个文件夹的大小(按大小递减的顺序):

from dropbox.client import DropboxClient
from collections import defaultdict

client = DropboxClient('<YOUR ACCESS TOKEN>')

sizes = {}
cursor = None
while cursor is None or result['has_more']:
    result = client.delta(cursor)
    for path, metadata in result['entries']:
        sizes[path] = metadata['bytes'] if metadata else 0
    cursor = result['cursor']

foldersizes = defaultdict(lambda: 0)
for path, size in sizes.items():
    segments = path.split('/')
    for i in range(1, len(segments)):
        folder = '/'.join(segments[:i])
        if folder == '': folder = '/'
        foldersizes[folder] += size

for folder in reversed(sorted(foldersizes.keys(), key=lambda x: foldersizes[x])):
    print '%s: %d' % (folder, foldersizes[folder])

编辑:我在第二个代码段(delta一个)中遇到了一个主要错误,我现在已经测试了所有这三个错误并发现它们都报告了相同的数字。

这有效:

from dropbox.client import DropboxClient

client = DropboxClient('<YOUR ACCESS TOKEN>')

def size(path):
    return sum(
        f['bytes'] if not f['is_dir'] else size(f['path'])
        for f in client.metadata(path)['contents']
    )

print size('/')

但使用/delta

效率更高
sizes = {}
cursor = None
while cursor is None or result['has_more']:
    result = client.delta(cursor)
    for path, metadata in result['entries']:
        sizes[path] = metadata['bytes'] if metadata else 0
    cursor = result['cursor']

print sum(sizes.values())

如果你真的需要知道帐户的整体使用情况,你可以这样做:

quota_info = client.account_info()['quota_info']
print quota_info['normal'] + quota_info['shared']