Office365-rest-python-client: ¿Cómo descargar de forma recursiva todos los archivos doc de sharepoint desde carpetas y subcarpetas?

Creado en 2 abr. 2019  ·  9Comentarios  ·  Fuente: vgrem/Office365-REST-Python-Client

Tengo un requisito en el que tengo que descargar de forma recursiva todos los archivos de la carpeta raíz, subcarpeta y subcarpeta de la subcarpeta Nth.

¿Cómo puedo hacerlo? ¿Existe algún método para enumerar carpetas en una carpeta en particular? Además, ¿cómo puedo enumerar carpetas en la biblioteca de documentos raíz? @vgrem @Bachatero

question

Comentario más útil

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

de esta manera, obtendrá la lista plana que contiene la carpeta principal y las subcarpetas Nth.

sin embargo, esto es más lento en términos de rendimiento.

Todos 9 comentarios

Obtuve un enlace, que dice que recuperamos la carpeta completa y el árbol de estructura de archivos mediante una consulta.

Primera respuesta de este enlace: https://sharepoint.stackexchange.com/questions/159105/with-rest-recursively-retrieve-file-and-folder-directory-structure

Estoy tratando de replicar esto desde el enlace anterior usando su api: / _api / web / Lists / GetByTitle ('Documentos') / Items? $ Select = FileLeafRef, FileRef

Pero cuando intento esto usando el siguiente código:

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

Falla con un error: "el objeto 'str' no tiene el atributo 'payload'"

¿Qué hacer?

Hola,

puede usar el enfoque de llamar a proc, que se llama a sí mismo de forma recursiva, por ejemplo:

def printAllContents (ctx, relativaUrl):

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)

metro.

... entonces puede, por ejemplo, descargar cada archivo usando ServerRelativeUrl que se imprime ...

Publiqué mi consulta aquí : de una manera más estructurada.

FYI: El JSON es solo para fines de representación / comprensión.

No estoy seguro de a qué te refieres. Creo que el proceso del que he enumerado un ejemplo simplemente hace eso ... enumera de forma recursiva todas las carpetas / subcarpetas y archivos dentro de estas carpetas y subcarpetas ...

Ejemplo de descarga de archivos a medida que baja por el árbol de forma recursiva ...

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

de esta manera, obtendrá la lista plana que contiene la carpeta principal y las subcarpetas Nth.

sin embargo, esto es más lento en términos de rendimiento.

Saludos,

ya que esta pregunta ha sido respondida propongo cerrarla

¿Fue útil esta página
0 / 5 - 0 calificaciones