我使用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的初学者在未来使用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)
这将获取保管箱文件夹主目录中所有文件的名称和大小。
我相信使用这段代码你会错过最后一次迭代:假设你有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中最后一次迭代一次。
我知道这是一个问题,但我自己也遇到了这个错误。
这两个答案都是准确的,但只是为了完成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])
这样你就可以在不破坏循环的情况下检索所有文件。