Office365-rest-python-client: フォルダとサブフォルダからすべてのSharePointドキュメントファイルを再帰的にダウンロードするにはどうすればよいですか?

作成日 2019年04月02日  ·  9コメント  ·  ソース: vgrem/Office365-REST-Python-Client

ルートフォルダー、サブフォルダー、およびサブフォルダーのサブからN番目にすべてのファイルを再帰的にダウンロードする必要があるという要件があります。

どうすればそれについて行くことができますか? 特定のフォルダ内のフォルダを一覧表示する方法はありますか? また、ルートドキュメントライブラリ内のフォルダを一覧表示するにはどうすればよいですか? @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)

m。

...次に、たとえば、印刷されるServerRelativeUrlを使用して各ファイルをダウンロードできます...

私はここにクエリを投稿し

参考:JSONは、表現/理解を目的としたものです。

何をしているのかわかりません。 私が例として挙げたprocは、それを実行していると思います...これらのフォルダーとサブフォルダー内のすべてのフォルダー/サブフォルダーとファイルを再帰的にリストします...

ツリーを再帰的に下るときにファイルをダウンロードする例...

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 評価