Office365-rest-python-client: Como baixar recursivamente todos os arquivos doc do sharepoint de pastas e subpastas?

Criado em 2 abr. 2019  ·  9Comentários  ·  Fonte: vgrem/Office365-REST-Python-Client

Eu tenho um requisito onde devo baixar recursivamente todos os arquivos da pasta raiz, subpasta e subpasta de subpasta para enésimo.

Como posso fazer isso? Existe um método para listar pastas em uma pasta específica? Além disso, como posso listar pastas na Biblioteca de documentos raiz? @vgrem @Bachatero

question

Comentários muito úteis

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

dessa forma, você terá uma lista simples que contém a pasta pai e as enésimas subpastas.

no entanto, isso é mais lento em termos de desempenho.

Todos 9 comentários

Recebi um link que diz que recuperamos toda a pasta e a árvore de estrutura de arquivos usando uma consulta.

Primeira resposta deste link: https://sharepoint.stackexchange.com/questions/159105/with-rest-recursively-retrieve-file-and-folder-directory-structure

Estou tentando replicar isso do link acima usando sua api: / _api / web / Lists / GetByTitle ('Documents') / Items? $ Select = FileLeafRef, FileRef

Mas quando tento fazer isso usando o código abaixo:

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

Ele falha com um erro: "objeto 'str' não tem atributo 'carga útil'"

O que fazer?

Oi,

você pode usar a abordagem de chamar proc, que se chama recursivamente, por exemplo:

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.

... você pode então, por exemplo, baixar cada arquivo usando ServerRelativeUrl que é impresso ...

Postei minha consulta aqui : de uma forma mais estruturada.

FYI: O JSON existe apenas para fins de representação / compreensão.

Não tenho certeza do que você está querendo dizer. Acho que a proc que listei como exemplo faz isso ... lista recursivamente todas as pastas / subpastas e arquivos dentro dessas pastas e subpastas ...

Exemplo de download de arquivos conforme você desce na árvore recursivamente ...

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

dessa forma, você terá uma lista simples que contém a pasta pai e as enésimas subpastas.

no entanto, isso é mais lento em termos de desempenho.

Saudações,

uma vez que esta questão foi respondida, proponho fechá-la

Esta página foi útil?
0 / 5 - 0 avaliações