Office365-rest-python-client: Wie kann ich einen SharePoint-Ordner herunterladen, der mehrere Dateien enthÀlt?

Erstellt am 27. MĂ€rz 2019  Â·  15Kommentare  Â·  Quelle: vgrem/Office365-REST-Python-Client

Mein Python-3-Code:

aus office365.runtime.auth.authentication_context importieren AuthenticationContext
aus office365.sharepoint.client_context importieren ClientContext

url = ' https://company.sharepoint.com/sites/abc '
ctx_auth = AuthenticationContext(url=url)
if ctx_auth.acquire_token_for_user(username='[email protected]', password='12345'):
ctx = ClientContext(url, ctx_auth)
Listen = ctx.web.lists
ctx.load(Listen)
ctx.execute_query()
fĂŒr l in Listen:
print(l.properties['Titel'])

Aus dem obigen Code kann ich die Elemente auf der Site auflisten. Mein Plan ist jedoch, dieses gesamte Modul in AWS Lambda mit Python auszufĂŒhren und von SharePoint-Dokumenten herunterzuladen und in AWS S3 zu speichern.

Ein Ordner kann mehrere Dateien enthalten. Ich möchte den gesamten Ordner mit allen Dateien herunterladen. Hat das jemand gemacht? Irgendeine Hilfe? Ein funktionierender Code wird eine große Hilfe sein, da ich völlig neu im Web-Scraping bin!

Hilfreichster Kommentar

Danke mir nicht, @vgrem ist schuld :) ... und ich bin mir nicht sicher, vielleicht gibt es andere Möglichkeiten, dasselbe zu erreichen ....

rechts, um alle Ordner in der Dokumentbibliothek fĂŒr freigegebene Dokumente aufzulisten, können Sie Folgendes versuchen:

    list_object = ctx.web.lists.get_by_title(listTitle)
    folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()

    folders = folder.folders
    ctx.load(folders)
    ctx.execute_query()

    for myfolder in folders:
        print("File name: {0}".format(myfolder.properties["Name"]))

m.

Alle 15 Kommentare

Hi,
vielleicht könntest du es in einer Schleife machen, zB:

  1. Geben Sie den Inhalt der Sharepoint-Dokumentenbibliothek zuerst mithilfe einer Funktion zurĂŒck:

listTitle = "Dokumente"
site = "abc"

def fncPrintLibraryContents(ctx, listTitle):

try:

    list_object = ctx.web.lists.get_by_title(listTitle)
    folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()

    files = folder.files
    ctx.load(files)
    ctx.execute_query()

    return files

except:

    print('Problem printing out library contents')   
    sys.exit(1)
  1. Laden Sie dann jede Datei herunter, indem Sie eine Prozedur aufrufen, zB:

def downloadFile(ctx, fileName):

try:
    with open(fileName, "wb") as localFile:            
        relativeUrl = '/sites/{0}/Shared%20Documents/{1}'.format(site, fileName)
        response = File.open_binary(ctx, relativeUrl)
        localFile.write(response.content) 
        localFile.close()

except:

    print('Problem downloading file:', fileName)
    sys.exit(1)

myfiles = fncPrintLibraryContents(ctx, listTitle)

fĂŒr myfile in myfiles:
print("Datei wird heruntergeladen: {0}".format(myfile.properties["Name"]))
downloadFile(ctx,` myfile.properties["Name"])

m.

Bitte rĂŒcken Sie die letzten beiden Zeilen in der for-Schleife ein, ich schaffe es anscheinend nicht.
m.

Hey,

Danke fĂŒr eine so schnelle Antwort. Ich kann die Dateien erfolgreich herunterladen, sofern ich den Dateinamen angeben muss. Um jedoch alle Dateien rekursiv herunterladen zu können, muss ich zuerst alle vorhandenen Dateien in einem bestimmten Ordner auflisten, die nach mehreren Versuchen die Fehler "Nicht gefunden" erhalten. Vielleicht mache ich irgendwo einen Fehler, weil mein Konzept des Titels nicht richtig ist. Wenn ich also versuche, einen Unterordner aufzulisten, indem ich diesen Namen als Titel angebe, scheitere ich. Ich werde deinen Code durchgehen und sehen, ob ich in der Lage bin, es zu tun.

In der Zwischenzeit funktioniert mein aktueller Code (Herunterladen funktioniert gut, das Auflisten von Ordnern und Dateien fĂŒr root funktioniert, aber immer wenn ich in Title einen anderen Ordnernamen als Documents angebe, schlĂ€gt es fehl):

`from office365.runtime.auth.authentication_context importieren AuthenticationContext
aus office365.sharepoint.client_context importieren ClientContext
aus office365.sharepoint.file importieren Datei
aus office365.sharepoint.file_creation_information importieren FileCreationInformation

def read_folder_and_files(context, list_title):
"""Beispiel fĂŒr einen Ordner lesen"""
list_obj = context.web.lists.get_by_title(list_title)
Ordner = list_obj.root_folder
Kontext.load(Ordner)
context.execute_query()
print("Listen-URL: {0}".format(folder.properties["ServerRelativeUrl"]))

files = folder.files
context.load(files)
context.execute_query()
for cur_file in files:
    print("File name: {0}".format(cur_file.properties["Name"]))

folders = context.web.folders
context.load(folders)
context.execute_query()
for folder in folders:
    print("Folder name: {0}".format(folder.properties["Name"]))

def download_file(kontext):
Antwort = File.open_binary(context, "/sites/new/Shared Documents/2011-A/file1.csv")
drucken (Antwort)
print(Antwort.Inhalt)
mit open(r"C:UsersaakashbDownloadstestfile1.csv", "wb") als local_file:
local_file.write(response.content)

ctx = Keine
url = ' https://company.sharepoint.com/sites/new '
ctx_auth = AuthenticationContext(url=url)
if ctx_auth.acquire_token_for_user(username='[email protected]', password='12345'):
ctx = ClientContext(url, ctx_auth)
read_folder_and_files(ctx, 'Dokumente')

print('Funktion eingeben')

download_file(ctx)

print('Funktion beenden')`

1) Entschuldigung fĂŒr die kaputte Struktur meines Codes, den ich Ihnen gegeben habe.
2) FĂŒhren Sie gerade Ihren Code aus und ĂŒberprĂŒfen Sie, ob er genau das tut, was mein Code in Bezug auf die Auflistung tut. Es listet die Dateien im Stammverzeichnis auf (nicht in einem Ordner). Aber ich möchte das gleiche fĂŒr Ordner tun.
3) Ich möchte auch die Ordner auflisten. Wenn ich den Code von @vgrem zum Auflisten von Ordnern verwende, werden mir nicht die Ordner der Dokumente

Ordnername: SitePages
Ordnername: Stilbibliothek
Ordnername: _catalogs
Ordnername: FormServerTemplates
Ordnername: _private
Ordnername: Freigabelinks
Ordnername: SiteAssets
Ordnername: Bilder
Ordnername: Freigegebene Dokumente
Ordnername: Listen
Ordnername: _cts

Welches sind keine der Ordner, die ich in der SharePoint Doc Lib habe.

Kurz gesagt, wie kann ich Doc Lib-Ordner und ihre entsprechenden herunterzuladenden Dateien auflisten?

Hi,
bitte schauen Sie sich das Problem hier an: https://github.com/vgrem/Office365-REST-Python-Client/issues/91
speziell an der Zeile, die so lautet:

Ordner = ctx.web.get_folder_by_server_relative_url(app_settings['urlrel'])

Wenn es nicht hilft, melde ich mich zurĂŒck, um Ihnen weitere Details mitzuteilen.
m.

... was ich meinte, war die Verwendung der Methode get_folder_by_server_relative_url anstelle von get_by_title, zB

app_settings = {'urlrel': '/sites/abc/Shared Documents/TEST'}

def printFolderContents(ctx, listTitle):

try:

    #list_object = ctx.web.lists.get_by_title(listTitle)
    folder = ctx.web.get_folder_by_server_relative_url(app_settings['urlrel'])
    #folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()
    #print(folder.url)

    files = folder.files
    ctx.load(files)
    ctx.execute_query()

    for myfile in files:
        print("File name: {0}".format(myfile.properties["Name"]))

except:

    print('Problem printing out library contents')   
    sys.exit(1)

Lass mich wissen, ob das hilft...

Um die Dateien aus dem TEST-Ordner innerhalb der Shared Documents-Bibliothek herunterzuladen, können Sie beispielsweise den obigen Code Àndern, um ihn zu einer Funktion zu machen, wie zum Beispiel:

def fncGetFolderContents(ctx, listTitle):

try:

    #list_object = ctx.web.lists.get_by_title(listTitle)
    folder = ctx.web.get_folder_by_server_relative_url(app_settings['urlrel'])
    #folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()
    #print(folder.url)

    files = folder.files
    ctx.load(files)
    ctx.execute_query()

    #for myfile in files:
    #    print("File name: {0}".format(myfile.properties["Name"]))

    return files

except:

    print('Problem printing out library contents')   
    sys.exit(1)

und Àndern Sie die Download-Funktion ein wenig, zB:

def downloadFolderFile(ctx, fileName):

try:
    with open(fileName, "wb") as localFile:            
        relativeUrl = '/sites/{0}/Shared%20Documents/{1}/{2}'.format(site, yourFolder, fileName)
        #relativeUrl = app_settings['urlrel']
        response = File.open_binary(ctx, relativeUrl)
        localFile.write(response.content) 
        localFile.close()

except:

    print('Problem downloading file:', fileName)
    sys.exit(1)

myfiles = fncGetFolderContents(ctx, listTitle)

fĂŒr myfile in myfiles:
print("Datei wird heruntergeladen: {0}".format(myfile.properties["Name"]))
downloadFolderFile(ctx, myfile.properties["Name"])

Vielen Dank Alter! Sie beide sind wirklich schnell in Antworten, und die API ist absolut großartig!

Ich werde es so schnell wie möglich durchgehen und versuchen, es zu replizieren. Aber gibt es eine Möglichkeit, die Ordner aufzulisten? Ich meine, der neueste Code, den Sie gegeben haben, funktioniert, wenn ich den Ordnernamen kenne. Falls ich den Vorgang automatisiere und ein neuer Ordner erstellt und Dateien aufbewahrt werden, funktioniert es fĂŒr den neuen Ordner nicht, oder? Deshalb wollte ich auch Listenordner, nur fĂŒr den Fall. Wie auch immer, die vorliegende Lösung sollte fĂŒr meinen Anwendungsfall funktionieren.

Vielen Dank an euch beide. Ich werde hier aktualisieren, sobald ich das Experiment durchgefĂŒhrt habe.

Danke mir nicht, @vgrem ist schuld :) ... und ich bin mir nicht sicher, vielleicht gibt es andere Möglichkeiten, dasselbe zu erreichen ....

rechts, um alle Ordner in der Dokumentbibliothek fĂŒr freigegebene Dokumente aufzulisten, können Sie Folgendes versuchen:

    list_object = ctx.web.lists.get_by_title(listTitle)
    folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()

    folders = folder.folders
    ctx.load(folders)
    ctx.execute_query()

    for myfolder in folders:
        print("File name: {0}".format(myfolder.properties["Name"]))

m.

Fantastisch. Iteratives Drucken und Herunterladen von Ordnerinhalten funktionierte!

Dankeschön,

Dieser Code lÀdt beschÀdigte PDF-Dateien herunter. Sie sind leer - 156 Byte. Irgendwelche Ideen warum?

Ich erhalte auch beschÀdigte PDF-Dateien mit nur 1 KB Dateinamen, indem ich den obigen Code verwende. Irgendeine Idee?

Ich erhalte auch beschÀdigte PDF-Dateien mit nur 1 KB Dateinamen, indem ich den obigen Code verwende. Irgendeine Idee?

Ich habe es herausgefunden, fĂŒr mich war der Grund die relative URL. Wenn ich Ordnerinhalte auflisten muss, muss ich nicht /sites/sitename/library etc. hinzufĂŒgen, es muss nur /library sein. Aber wenn ich die Dateien bereits herunterlade, muss ich /sites/sitename/folder/file hinzufĂŒgen.

Das ist wirklich seltsam, weil ich immer noch auf Dateien zugreifen und diese herunterladen kann, ohne /sites/sitename/ hinzuzufĂŒgen, aber der Inhalt ist dann beschĂ€digt. Wenn ich gleichzeitig /sites/sitename/ hinzufĂŒge, wenn ich Ordnerinhalt erhalte, wird ein Fehler ausgegeben und funktioniert nur, wenn ich die relative URL mit einer Bibliothek starte.

Es ist seltsam, dass jede einzelne Ressource vorschlĂ€gt, /sites/sitename zur relativen URL fĂŒr Ordnerinhalt und Dateiinhalt hinzuzufĂŒgen.

Danke fĂŒr Vorschlag. Können Sie den endgĂŒltigen Arbeitscode teilen? Wenn wir den gesamten Inhalt von Unterordnern wie /sites/sitename/Documents/somefolder herunterladen möchten, was wĂ€re dann der endgĂŒltige Code?

Danke Leute. Dies hilft bei der Lösung vieler Probleme und Probleme, die bei der Verwendung des Sharepoint-Pakets auftreten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen