Office365-rest-python-client: Wie lade ich rekursiv alle Sharepoint-Dokumentdateien aus Ordnern und Unterordnern herunter?

Erstellt am 2. Apr. 2019  ·  9Kommentare  ·  Quelle: vgrem/Office365-REST-Python-Client

Ich habe eine Anforderung, bei der ich rekursiv alle Dateien vom Stammordner, Unterordner und Unterordner auf Nth herunterladen muss.

Wie kann ich vorgehen? Gibt es eine Methode zum Auflisten von Ordnern in einem bestimmten Ordner? Wie kann ich Ordner in der Stammdokumentbibliothek auflisten? @vgrem @Bachatero

question

Hilfreichster Kommentar

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

Auf diese Weise erhalten Sie die flache Liste, die den übergeordneten Ordner und den n-ten Unterordner enthält.

Dies ist jedoch in Bezug auf die Leistung langsamer.

Alle 9 Kommentare

Ich habe einen Link erhalten, der besagt, dass wir den gesamten Ordner- und Dateistrukturbaum mithilfe einer Abfrage abrufen.

Erste Antwort auf diesen Link: https://sharepoint.stackexchange.com/questions/159105/with-rest-recursively-retrieve-file-and-folder-directory-structure

Ich versuche, dies über den obigen Link mit Ihrer API zu replizieren: / _api / web / Lists / GetByTitle ('Dokumente') / Items? $ Select = FileLeafRef, FileRef

Aber wenn ich das mit folgendem Code versuche:

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

Es schlägt mit einem Fehler fehl: "'str' Objekt hat kein Attribut 'Payload'"

Was zu tun ist?

Hallo,

Sie können den Ansatz verwenden, proc aufzurufen, der sich selbst rekursiv aufruft, z.

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.

... Sie können dann beispielsweise jede Datei mit ServerRelativeUrl herunterladen, die ausgedruckt wird ...

Ich habe meine Anfrage hier gepostet: strukturierter.

Zu Ihrer Information: Der JSON dient nur zu Darstellungs- / Verständniszwecken.

Ich bin mir nicht sicher, worauf du hinaus willst. Ich denke, der Prozess, für den ich ein Beispiel aufgelistet habe, macht das einfach ... listet rekursiv alle Ordner / Unterordner und Dateien in diesen Ordnern und Unterordnern auf ...

Beispiel für das Herunterladen der Dateien, wenn Sie den Baum rekursiv durchgehen ...

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

Auf diese Weise erhalten Sie die flache Liste, die den übergeordneten Ordner und den n-ten Unterordner enthält.

Dies ist jedoch in Bezug auf die Leistung langsamer.

Schöne Grüße,

Da diese Frage beantwortet wurde, schlage ich vor, sie zu schließen

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen