2013-11-29 2 views
3

EDIT: Я хочу, чтобы вычислить каждый размер папки не только весь размер раздаточная ... Мой код работает отлично по размеру всей DropboxВычислить Каждый размер папки Dropbox рекурсивно с помощью Python API

У меня возникают трудности при расчете размер каждой папки в Dropbox с помощью Python API в раздаточной возвращает размер папки в ноль

вот мой код до сих пор, но это дает мне неправильный ответ

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" 
+0

Вы хотите сделать это для локальных или удаленных файлов? – RickyA

+0

Конечно удаленные файлы – Rohit

+0

Где вы инициализируете 'global size' (до нуля)? – martineau

ответ

4

EDIT 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]) 

EDIT: У меня была главная ошибка во втором фрагменте кода (delta один), и я 've теперь проверил все три и нашел их всех, чтобы сообщить тот же самый номер.

Это работает:

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'] 
+0

На самом деле, я хочу рассчитать размер каждой папки отдельно, а не только всю квоту Dropbox – Rohit

+0

Мой код отлично дает мне тоже квоту – Rohit

+0

Как это на 1000% быстрее! ?? он работает спасибо – Rohit

Смежные вопросы