Office365-rest-python-client: Wie kann ich den Dateinamen (mit Erweiterung) abrufen?

Erstellt am 17. Juni 2020  ·  4Kommentare  ·  Quelle: vgrem/Office365-REST-Python-Client

Guten Nachmittag,

Ich habe an einer rekursiven Schleife gearbeitet, die es mir ermöglicht, einige Elemente in einer Bibliothek zu finden und herunterzuladen.

Bisher habe ich alle Elemente erhalten, kann sie aber nicht herunterladen, da in den Eigenschaften des Elements das Feld "Name" nicht auftaucht.

Wenn ich das Element in eine Datei umwandele, sind die Eigenschaften null ({}), sodass ich den Namen nicht abrufen kann.

Da die Methode file.dowload() eine Datei erfordert und ich die aktuelle Erweiterung der Datei nicht kenne, ist es ziemlich unmöglich, die Datei herunterzuladen.

Irgendwelche Vorschläge?

Der Code den ich verwende ist folgender:

from office365.runtime.auth.ClientCredential import ClientCredential
from office365.sharepoint.client_context import ClientContext
from office365.sharepoint.file import File
from office365.sharepoint.camlQuery import CamlQuery

ctx = ClientContext.connect_with_credentials(site_url, ClientCredential(client_id, client_secret))
lib = ctx.web.lists.get_by_title("XXX")
caml_query = CamlQuery()
caml_query.ViewXml = """XXX"""

items = lib.get_items(caml_query)
ctx.load(lib)
ctx.execute_query()
for item in items:
    file = item.file
    with open(download_path, "wb") as local_file:
        file.download(local_file)
        ctx.execute_query()
        print("[Ok] file has been downloaded: {0}".format(download_path))

Danke im Voraus!

question

Hilfreichster Kommentar

Guten Morgen,

Ich konnte mein Problem lösen.

Nach dem Durchlaufen der Artikelliste müssen Sie den Kontext für jede Datei aufrufen, um die Eigenschaften der Datei einschließlich des Namens abzurufen, dann können Sie die Datei herunterladen.

Das ist mein Code unten:

client_id = "XXX"
client_secret = "XXX"
site_url = "XXX"
download_folder = r'C:\Users\yourname\sharepoint'


from office365.runtime.auth.ClientCredential import ClientCredential
from office365.sharepoint.client_context import ClientContext
from office365.sharepoint.file import File
from office365.sharepoint.camlQuery import CamlQuery


ctx = ClientContext.connect_with_credentials(site_url, ClientCredential(client_id, client_secret))
lib = ctx.web.lists.get_by_title("REO")
caml_query = CamlQuery()
caml_query.ViewXml = XXX
items = lib.get_items(caml_query)
ctx.load(items)
ctx.execute_query()
for item in items:
    file = item.file
    ctx.load(file)
    ctx.execute_query()
    file_name = "{0}".format(file.properties["Name"])
    download_path = download_folder + '//' + file_name
    with open(download_path, "wb") as local_file:
        file.download(local_file)
        ctx.execute_query()
        print("[Ok] file has been downloaded: {0}".format(download_path))

Alle 4 Kommentare

Guten Morgen,

Ich konnte mein Problem lösen.

Nach dem Durchlaufen der Artikelliste müssen Sie den Kontext für jede Datei aufrufen, um die Eigenschaften der Datei einschließlich des Namens abzurufen, dann können Sie die Datei herunterladen.

Das ist mein Code unten:

client_id = "XXX"
client_secret = "XXX"
site_url = "XXX"
download_folder = r'C:\Users\yourname\sharepoint'


from office365.runtime.auth.ClientCredential import ClientCredential
from office365.sharepoint.client_context import ClientContext
from office365.sharepoint.file import File
from office365.sharepoint.camlQuery import CamlQuery


ctx = ClientContext.connect_with_credentials(site_url, ClientCredential(client_id, client_secret))
lib = ctx.web.lists.get_by_title("REO")
caml_query = CamlQuery()
caml_query.ViewXml = XXX
items = lib.get_items(caml_query)
ctx.load(items)
ctx.execute_query()
for item in items:
    file = item.file
    ctx.load(file)
    ctx.execute_query()
    file_name = "{0}".format(file.properties["Name"])
    download_path = download_folder + '//' + file_name
    with open(download_path, "wb") as local_file:
        file.download(local_file)
        ctx.execute_query()
        print("[Ok] file has been downloaded: {0}".format(download_path))

@pobs93 Ich versuche, Ihren Quellcode zu verwenden, um Anhänge von einer Sharepoint-Liste herunterzuladen.
Ich habe diese Zeile hier kommentiert, da ich nicht weiß, welche Parameter ich dafür verwenden soll:
caml_query.ViewXml = XXX
Aber wenn ich den Code ausführe, erhalte ich die folgende Fehlermeldung in Zeile ctx.execute_query()
TypeError: Objekt vom Typ CamlQuery ist nicht JSON-serialisierbar

Ich bin neu bei dieser Art von API, also habe ich mich gefragt, ob Sie das klären könnten.
TKS

@ pobs93 Nur um eine Erklärung zu der Liste hinzuzufügen, von der ich versuche, Anhänge herunterzuladen.
Das sind die DEFAULT-Schlüssel aus der Liste, die ich habe, und ich sehe die URL des Anhangs hier nicht, aber sie sind da (siehe Bild im Anhang).
{'Dateisystemobjekttyp': -,
'Ausweis': -,
'ServerRedirectedEmbedUri': Keine,
'ServerRedirectedEmbedUrl': '',
'ContentTypeId': -,
'Titel': -,
'ComplianceAssetId': Keine,
'ICH WÜRDE': -,
'Geändert': -,
'Erstellt': -,
'AutorId': 12,
'EditorId': 12,
'OData__UIVersionString': '1.0',
'Anhänge': Stimmt,
'GUID': -}

sp_attachment

Das folgende Beispiel zeigt, wie Sie _Dateiname_ und _Datei-URL_ für Listenelement abrufen:


ctx = ClientContext(settings['url']).with_credentials(client_creds)

lib = ctx.web.lists.get_by_title("Documents")
items = lib.items
ctx.load(items, ["ID", "FileLeafRef", "FileRef"])

ctx.execute_query()
for item in items:
    print(f"FileRef: {item.properties['FileRef']}") 

wo

  • FileLeafRef - Identifiziert ein Feld, das Informationen über die serverrelative URL für den Dateiknoten enthält, der mit ListItem verknüpft ist

  • FileRef - Identifiziert ein Feld, das Informationen über die serverrelative URL für ListItem enthält

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen