Office365-rest-python-client: 如何从文件夹和子文件夹递归下载所有sharepoint doc文件?

创建于 2019-04-02  ·  9评论  ·  资料来源: vgrem/Office365-REST-Python-Client

我有一个要求,我必须将所有文件从根文件夹,子文件夹和子文件夹的子目录递归下载到Nth。

我该怎么办? 有没有列出特定文件夹中的文件夹的方法? 另外,如何列出根文档库中的文件夹? @vgrem @Bachatero

question

最有用的评论

folder_list = []

def get_folder_relativeUrl(context, folder_relativeUrl):

    libraryRoot = context.web.get_folder_by_server_relative_url(folder_relativeUrl)
    folders = libraryRoot.folders
    context.load(folders)
    context.execute_query()

    for cur_folder in folders:
        folder_list.append(cur_folder.properties["ServerRelativeUrl"])
        get_folder_relativeUrl(context, cur_folder.properties["ServerRelativeUrl"])

    return folder_list

这种方式将为您提供包含上级文件夹和第N个子文件夹的平面列表。

但是,这在性能方面较慢。

所有9条评论

得到了一个链接,该链接表示我们使用查询检索了整个文件夹和文件结构树。

该链接的第一个答案: https :

我正在尝试使用您的api从上面的链接复制此内容:/ _api / web / Lists / GetByTitle('Documents')/ Items?$ select = FileLeafRef,FileRef

但是当我尝试使用下面的代码:

folder = ctx.web.lists.get_by_title('Documents')
folder = folder.get_items('$select=FileLeafRef,FileRef')

它失败并显示错误:“'str'对象没有属性'payload'”

该怎么办?

你好,

您可以使用调用proc的方法,该方法以递归方式调用自身,例如:

def printAllContents(ctx,relativeUrl):

try:

    libraryRoot = ctx.web.get_folder_by_server_relative_url(relativeUrl)
    ctx.load(libraryRoot)
    ctx.execute_query()

    folders = libraryRoot.folders
    ctx.load(folders)
    ctx.execute_query()

    for myfolder in folders:
        print("Folder name: {0}".format(myfolder.properties["ServerRelativeUrl"]))
        printAllContents(ctx, relativeUrl + '/' + myfolder.properties["Name"])

    files = libraryRoot.files
    ctx.load(files)
    ctx.execute_query()

    for myfile in files:
        #print("File name: {0}".format(myfile.properties["Name"]))
        print("File name: {0}".format(myfile.properties["ServerRelativeUrl"]))
except:

    print('Problem printing out list of folders')   
    sys.exit(1)

...例如,您随后可以使用ServerRelativeUrl下载每个文件,该文件将被打印出来...

我在这里以更结构化的方式发布了我的查询。

仅供参考:JSON仅用于表示/理解目的。

我不确定你在说什么。 我认为我列出的示例只是这样的过程...递归列出了这些文件夹和子文件夹中的所有文件夹/子文件夹和文件...

以递归方式下载文件的示例...

outputDir = "d:\output"

def printAllContents(ctx, relativeUrl):

    try:

        libraryRoot = ctx.web.get_folder_by_server_relative_url(relativeUrl)
        ctx.load(libraryRoot)
        ctx.execute_query()

        folders = libraryRoot.folders
        ctx.load(folders)
        ctx.execute_query()

        for myfolder in folders:
            #print("Folder name: {0}".format(myfolder.properties["Name"]))
            print("Folder name: {0}".format(myfolder.properties["ServerRelativeUrl"]))
            printAllContents(ctx, relativeUrl + '/' + myfolder.properties["Name"])

        files = libraryRoot.files
        ctx.load(files)
        ctx.execute_query()

        for myfile in files:
            print("File name: {0}".format(myfile.properties["ServerRelativeUrl"]))
            pathList = myfile.properties["ServerRelativeUrl"].split('/')
            fileDest = outputDir + "/"+ pathList[-1]
            downloadFile(ctx, fileDest, myfile.properties["ServerRelativeUrl"])

    except:

        print('Problem printing out list of folders')   
        sys.exit(1)
folder_list = []

def get_folder_relativeUrl(context, folder_relativeUrl):

    libraryRoot = context.web.get_folder_by_server_relative_url(folder_relativeUrl)
    folders = libraryRoot.folders
    context.load(folders)
    context.execute_query()

    for cur_folder in folders:
        folder_list.append(cur_folder.properties["ServerRelativeUrl"])
        get_folder_relativeUrl(context, cur_folder.properties["ServerRelativeUrl"])

    return folder_list

这种方式将为您提供包含上级文件夹和第N个子文件夹的平面列表。

但是,这在性能方面较慢。

问候,

既然已经回答了这个问题,我建议关闭它

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Mark531 picture Mark531  ·  11评论

bobbydurrett picture bobbydurrett  ·  8评论

liuliqiu picture liuliqiu  ·  7评论

ahulist picture ahulist  ·  5评论

domdinicola picture domdinicola  ·  4评论