Office365-rest-python-client: Bagaimana cara mengunduh semua file doc sharepoint secara rekursif dari folder dan subfolder?

Dibuat pada 2 Apr 2019  ·  9Komentar  ·  Sumber: vgrem/Office365-REST-Python-Client

Saya memiliki persyaratan di mana saya harus mengunduh semua file secara rekursif dari folder root, subfolder dan sub dari subfolder ke N.

Bagaimana saya bisa melakukannya? Apakah ada metode untuk membuat daftar folder di folder tertentu? Juga, bagaimana saya bisa membuat daftar folder di pustaka dokumen root? @vgrem @Bachatero

question

Komentar yang paling membantu

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

cara ini akan memberi Anda daftar datar berisi folder Induk dan sub folder N ..

Namun, ini lebih lambat dalam hal kinerja.

Semua 9 komentar

Punya tautan, yang mengatakan kami mengambil seluruh folder dan pohon struktur file menggunakan kueri.

Jawaban pertama dari tautan ini: https://sharepoint.stackexchange.com/questions/159105/with-rest-recursively-retrieve-file-and-folder-directory-structure

Saya mencoba mereplikasi ini dari tautan di atas menggunakan api Anda: / _api / web / List / GetByTitle ('Documents') / Items? $ Select = FileLeafRef, FileRef

Tetapi ketika saya mencoba ini menggunakan kode di bawah ini:

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

Gagal dengan kesalahan: "objek 'str' tidak memiliki atribut 'payload'"

Apa yang harus dilakukan?

Hai,

Anda mungkin menggunakan pendekatan memanggil proc, yang secara rekursif memanggil dirinya sendiri, misalnya:

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.

... Anda kemudian dapat, misalnya, mengunduh setiap file menggunakan ServerRelativeUrl yang akan dicetak ...

Saya memposting pertanyaan saya di sini : dengan cara yang lebih terstruktur.

FYI: JSON di sana hanya untuk tujuan representasi / pemahaman.

Saya tidak yakin apa yang Anda maksud. Saya pikir proc yang saya cantumkan contoh hanya melakukan itu ... secara rekursif mencantumkan semua folder / subfolder dan file di dalam folder dan subfolder ini ...

Contoh mengunduh file saat Anda menuruni pohon secara rekursif ...

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

cara ini akan memberi Anda daftar datar berisi folder Induk dan sub folder N ..

Namun, ini lebih lambat dalam hal kinerja.

Salam pembuka,

karena pertanyaan ini telah dijawab, saya mengusulkan untuk menutupnya

Apakah halaman ini membantu?
0 / 5 - 0 peringkat