Office365-rest-python-client: Comment récupérer le nom du fichier (avec extension) ?

Créé le 17 juin 2020  ·  4Commentaires  ·  Source: vgrem/Office365-REST-Python-Client

Bonne après-midi,

J'ai travaillé sur une boucle récursive qui me permet de trouver des éléments dans une bibliothèque et de les télécharger.

Jusqu'à présent, j'ai pu obtenir tous les éléments mais je ne parviens pas à les télécharger car dans les propriétés de l'élément, le champ "Nom" n'apparaît pas.

Lorsque je convertis l'élément en fichier, les propriétés sont nulles ({}) donc je ne peux pas obtenir le nom.

Étant donné que la méthode file.dowload() nécessite un fichier et que je ne connais pas l'extension actuelle du fichier, il est pratiquement impossible de télécharger le fichier.

Des suggestions?

Le code que j'utilise est le suivant :

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))

Merci d'avance!

question

Commentaire le plus utile

Bonjour,

J'ai pu résoudre mon problème.

Après avoir parcouru la liste des éléments, vous devez appeler le contexte pour chaque fichier, il récupérera les propriétés du fichier qui incluent le nom, puis vous pourrez télécharger le fichier.

Voici mon code ci-dessous :

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))

Tous les 4 commentaires

Bonjour,

J'ai pu résoudre mon problème.

Après avoir parcouru la liste des éléments, vous devez appeler le contexte pour chaque fichier, il récupérera les propriétés du fichier qui incluent le nom, puis vous pourrez télécharger le fichier.

Voici mon code ci-dessous :

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 J'essaie d'utiliser votre code source pour télécharger des pièces jointes à partir d'une liste Sharepoint.
J'ai commenté cette ligne ici car je ne sais pas quels paramètres utiliser:
caml_query.ViewXml = XXX
Mais lorsque j'exécute le code, j'obtiens l'erreur ci-dessous à la ligne ctx.execute_query()
TypeError : l'objet de type CamlQuery n'est pas sérialisable en JSON

Je suis nouveau dans ce type d'API donc je me demandais si vous pouviez clarifier.
TKS

@ pobs93 Juste pour ajouter quelques explications sur la liste à partir de laquelle j'essaie de télécharger des pièces jointes.
Ce sont les clés par défaut de la liste que j'ai et je ne vois pas l'URL de la pièce jointe ici, mais elles sont là (voir photo ci-jointe).
{'FileSystemObjectType' : -,
'Identifiant': -,
'ServerRedirectedEmbedUri' : aucun,
'ServerRedirectedEmbedUrl' : '',
'ContentTypeId' : -,
'Titre': -,
'ComplianceAssetId' : aucun,
'IDENTIFIANT': -,
'Modifié' : -,
'Créé': -,
'Auteur' : 12,
'EditorId' : 12,
'OData__UIVersionString' : '1.0',
« Pièces jointes » : vrai,
'GUIDE' : -}

sp_attachment

L'exemple suivant montre comment récupérer _file name_ et _file url_ pour l'élément de liste :


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']}") 

  • FileLeafRef - Identifie un champ qui contient des informations sur l'URL relative au serveur pour le nœud de fichier associé à ListItem

  • FileRef - Identifie un champ qui contient des informations sur l'URL relative au serveur pour ListItem

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