Office365-rest-python-client: Como recuperar o nome do arquivo (com extensão)?

Criado em 17 jun. 2020  ·  4Comentários  ·  Fonte: vgrem/Office365-REST-Python-Client

Boa tarde,

Tenho trabalhado em um loop recursivo que me permite encontrar alguns itens em uma biblioteca e baixá-los.

Até agora consegui obter todos os elementos, mas não consegui baixá-los porque nas propriedades do elemento o campo "Nome" não está aparecendo.

Quando eu converto o elemento em um arquivo, as propriedades são nulas ({}), então não consigo obter o nome.

Como o methot file.dowload () requer um arquivo e eu não sei a extensão atual do arquivo, é praticamente impossível fazer o download do arquivo.

Alguma sugestão?

O código que estou usando é o seguinte:

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

Desde já, obrigado!

question

Comentários muito úteis

Bom Dia,

Consegui resolver meu problema.

Após iter dentro da lista de itens, você precisa chamar o contexto para cada arquivo, ele irá recuperar as propriedades do arquivo que inclui o nome, então você pode baixar o arquivo.

Este é o meu código abaixo:

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 comentários

Bom Dia,

Consegui resolver meu problema.

Após iter dentro da lista de itens, você precisa chamar o contexto para cada arquivo, ele irá recuperar as propriedades do arquivo que inclui o nome, então você pode baixar o arquivo.

Este é o meu código abaixo:

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 Estou tentando usar seu código-fonte para baixar anexos de uma lista do Sharepoint.
Comentei esta linha aqui porque não sei quais parâmetros usar nela:
caml_query.ViewXml = XXX
Mas quando executo o código, recebo o erro abaixo na linha ctx.execute_query()
TypeError: o objeto do tipo CamlQuery não é serializável em JSON

Eu sou novo neste tipo de API, então gostaria de saber se você poderia esclarecer.
TKS

@ pobs93 Só para acrescentar alguma explicação sobre a lista da qual estou tentando fazer download de anexos.
Essas são as chaves DEFAULT da lista que tenho e não vejo a URL do anexo aqui, mas elas estão lá (veja a imagem em anexo).
{'FileSystemObjectType': -,
'Identificação': -,
'ServerRedirectedEmbedUri': Nenhum,
'ServerRedirectedEmbedUrl': '',
'ContentTypeId': -,
'Título': -,
'ComplianceAssetId': Nenhum,
'EU IRIA': -,
'Modificado': -,
'Criada': -,
'AuthorId': 12,
'EditorId': 12,
'OData__UIVersionString': '1.0',
'Anexos': Verdadeiro,
'GUID': -}

sp_attachment

O exemplo a seguir demonstra como recuperar _file name_ e _file url_ para o item da 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']}") 

Onde

  • FileLeafRef - Identifica um campo que contém informações sobre a URL relativa ao servidor para o nó do arquivo que está associado a ListItem

  • FileRef - Identifica um campo que contém informações sobre o URL relativo ao servidor para ListItem

Esta página foi útil?
0 / 5 - 0 avaliações