Office365-rest-python-client: Comment télécharger récursivement tous les fichiers doc sharepoint à partir de dossiers et sous-dossiers?

Créé le 2 avr. 2019  ·  9Commentaires  ·  Source: vgrem/Office365-REST-Python-Client

J'ai une exigence où je dois télécharger de manière récursive tous les fichiers du dossier racine, du sous-dossier et du sous-dossier du sous-dossier vers Nth.

Comment puis-je m'y prendre? Existe-t-il une méthode pour répertorier les dossiers dans un dossier particulier? En outre, comment puis-je répertorier les dossiers dans la bibliothèque de documents racine? @vgrem @Bachatero

question

Commentaire le plus utile

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 cette façon, vous obtiendrez la liste plate contenant le dossier Parent et le Nième sous-dossiers.

cependant, cela est plus lent en termes de performances.

Tous les 9 commentaires

Vous avez un lien, qui indique que nous récupérons l'ensemble de l'arborescence des dossiers et des fichiers à l'aide d'une requête.

Première réponse de ce lien: https://sharepoint.stackexchange.com/questions/159105/with-rest-recursively-retrieve-file-and-folder-directory-structure

J'essaie de reproduire cela à partir du lien ci-dessus en utilisant votre api: / _api / web / Lists / GetByTitle ('Documents') / Items? $ Select = FileLeafRef, FileRef

Mais quand j'essaye ceci en utilisant le code ci-dessous:

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

Il échoue avec une erreur: "L'objet 'str' n'a pas d'attribut 'payload'"

Que faire?

Salut,

vous pouvez utiliser l'approche de l'appel de proc, qui s'appelle récursivement, par exemple:

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.

... vous pouvez ensuite, par exemple, télécharger chaque fichier en utilisant ServerRelativeUrl qui est imprimé ...

J'ai posté ma requête ici : de manière plus structurée.

FYI: Le JSON est juste à des fins de représentation / compréhension.

Je ne sais pas trop où vous voulez en venir. Je pense que le processus dont j'ai listé un exemple fait juste cela ... répertorie de manière récursive tous les dossiers / sous-dossiers et fichiers dans ces dossiers et sous-dossiers ...

Exemple de téléchargement des fichiers au fur et à mesure que vous descendez l'arborescence de manière récursive ...

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 cette façon, vous obtiendrez la liste plate contenant le dossier Parent et le Nième sous-dossiers.

cependant, cela est plus lent en termes de performances.

Les salutations,

depuis que cette question a été répondue, je propose de la fermer

Cette page vous a été utile?
0 / 5 - 0 notes