如何使用DropboxPythonAPI获取所有文件的元数据?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (127)

我使用DropboxPythonAPI连接到的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功能。如何使用这些?

提问于
用户回答回答于

我相信,在最后一次迭代中,你将忽略这段代码:假设你有11189项。在我的案件档案里_列单_文件夹每次返回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条目。

用户回答回答于

我意识到有一个解决这个问题的方法,所以我想如果在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)

它获取Dropbox文件夹主目录中所有文件的名称和大小。

扫码关注云+社区

领取腾讯云代金券