使用Dropbox Python API获取所有文件的元数据

问题描述 投票:1回答:3

我使用Dropbox Python API连接的Dropbox帐户在其主文件夹中有大约10k个文件。我有兴趣获取所有文件的元数据信息,当我调用以下内容时:

client = dropbox.Dropbox('TOKEN HERE')
metadata = client.files_list_folder('').entries
fname = []
for i in metadata:
    fname.append(i)
print(len(fname))

它只打印出2000个文件。我发现它只是打印出这样的圆号的信息,这让我觉得这是一个硬限制。

我知道有files_list_folder_continue函数,如果我理解正确,继续寻找files_list_folder函数停止的元数据,但我不知道如何实现它。我尝试了以下方法:

metadata = client.files_list_folder('').entries
metadata1 = client.files_list_folder_continue('').entries
met = pd.concat([metadata, metadata1], axis=0)

但它产生以下错误:dropbox.stone_validators.ValidationError: '' must be at least 1 characters, got 0。显然,这与我不知道如何使用files_list_folder_continue功能的事实有关。怎么用这些?

python dropbox-api
3个回答
2
投票

我意识到有一种方法可以解决这个问题,所以我认为如果python的初学者在未来使用python遇到同样的疑问,我会发布这个:

metadata = client.files_list_folder('')
flist = []
if metadata.has_more == True:
    m1 = metadata.entries
    cur = metadata.cursor
    for i in m1:
        if isinstance(i, dropbox.files.FileMetadata):
            flist.append([i.name, i.size])
    m2 = client.files_list_folder_continue(cur)
    while m2.has_more == True:
        for i in m2.entries:
            if isinstance(i, dropbox.files.FileMetadata):
                flist.append([i.name, i.size])
        cur = m2.cursor
        m2 = client.files_list_folder_continue(cur)

这将获取保管箱文件夹主目录中所有文件的名称和大小。


0
投票

我相信使用这段代码你会错过最后一次迭代:假设你有11189项。在我的情况下,files_list_folder每次都返回2000。

metadata = client.files_list_folder('')
flist = []
if metadata.has_more == True:
    m1 = metadata.entries
    cur = metadata.cursor
    for i in m1:
        if isinstance(i, dropbox.files.FileMetadata):
            flist.append([i.name, i.size])
    # flist now has 2000 items
    m2 = client.files_list_folder_continue(cur)
    while m2.has_more == True:
        for i in m2.entries:
            if isinstance(i, dropbox.files.FileMetadata):
                flist.append([i.name, i.size])
        cur = m2.cursor
        # 1st time : flist will have 4000 and m2.has_more==True
        # 2nd time : flist will have 6000 and m2.has_more==True
        # 3rd time : flist will have 8000 and m2.has_more==True
        # 4th time : flist will have 10000 and m2.has_more==True
        m2 = client.files_list_folder_continue(cur)
        # 5th time : m2.entries will have 1189 files but m2.has_more==False
        # so you'll step out of the loop without iterating through those 1189 entries

在while循环之外,您需要在m2.entries中最后一次迭代一次。

我知道这是一个问题,但我自己也遇到了这个错误。


0
投票

这两个答案都是准确的,但只是为了完成Daviid的代码,我会在else中添加一个while语句来获取剩余的文件:

flist = []
if metadata.has_more == True:
    m1 = metadata.entries
    cur = metadata.cursor
    for i in m1:
        if isinstance(i, dropbox.files.FileMetadata):
            flist.append([i.name, i.size])
    # flist now has 2000 items
    m2 = client.files_list_folder_continue(cur)
    while m2.has_more == True:
        for i in m2.entries:
            if isinstance(i, dropbox.files.FileMetadata):
                flist.append([i.name, i.size])
        cur = m2.cursor
        m2 = client.files_list_folder_continue(cur)entries
    else:
        m_final = client.files_list_folder_continue(cur)
        for i in m_final.entries:
            if isinstance(i, dropbox.files.FileMetadata):
            flist.append([i.name, i.size])

这样你就可以在不破坏循环的情况下检索所有文件。

© www.soinside.com 2019 - 2024. All rights reserved.