Office365-rest-python-client: ¿Cómo recuperar el nombre del archivo (con extensión)?

Creado en 17 jun. 2020  ·  4Comentarios  ·  Fuente: vgrem/Office365-REST-Python-Client

Buenas tardes,

He estado trabajando en un ciclo recursivo que me permite encontrar algunos elementos en una biblioteca y descargarlos.

Hasta ahora he podido obtener todos los elementos pero no puedo descargarlos porque en las propiedades del elemento no aparece el campo "Nombre".

Cuando convierto el elemento en un archivo, las propiedades son nulas ({}) por lo que no puedo obtener el nombre.

Dado que file.dowload () methot requiere un archivo y no sé la extensión actual del archivo, es bastante imposible descargar el archivo.

¿Alguna sugerencia?

El código que estoy usando es el siguiente:

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

¡Gracias por adelantado!

question

Comentario más útil

Buenos días,

Pude resolver mi problema.

Después de estar dentro de la lista de elementos, debe llamar al contexto para cada archivo, recuperaría las propiedades del archivo que incluye el nombre, luego puede descargar el archivo.

Este es mi código a continuación:

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

Todos 4 comentarios

Buenos días,

Pude resolver mi problema.

Después de estar dentro de la lista de elementos, debe llamar al contexto para cada archivo, recuperaría las propiedades del archivo que incluye el nombre, luego puede descargar el archivo.

Este es mi código a continuación:

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 Estoy intentando usar su código fuente para descargar archivos adjuntos de una lista de Sharepoint.
Comenté esta línea aquí porque no sé qué parámetros usar en ella:
caml_query.ViewXml = XXX
Pero cuando ejecuto el código, aparece el siguiente error en la línea ctx.execute_query()
TypeError: el objeto de tipo CamlQuery no es serializable JSON

Soy nuevo en este tipo de API, así que me preguntaba si podría aclararme.
TKS

@ pobs93 Solo para agregar una explicación sobre la lista de la que estoy tratando de descargar archivos adjuntos.
Esas son las claves PREDETERMINADAS de la lista que tengo y no veo la URL del archivo adjunto aquí, pero están allí (vea la imagen adjunta).
{'FileSystemObjectType': -,
'Identificación': -,
'ServerRedirectedEmbedUri': Ninguno,
'ServerRedirectedEmbedUrl': '',
'ContentTypeId': -,
'Título': -,
'ComplianceAssetId': Ninguno,
'IDENTIFICACIÓN': -,
'Modificado': -,
'Creado': -,
'AuthorId': 12,
'EditorId': 12,
'OData__UIVersionString': '1.0',
'Archivos adjuntos': Verdadero,
'GUID': -}

sp_attachment

El siguiente ejemplo demuestra cómo recuperar _nombre de archivo_ y _url de archivo_ para el elemento de la lista:


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

dónde

  • FileLeafRef : identifica un campo que contiene información sobre la URL relativa al servidor para el nodo de archivo que está asociado con ListItem

  • FileRef : identifica un campo que contiene información sobre la URL relativa al servidor para ListItem

¿Fue útil esta página
0 / 5 - 0 calificaciones