【问题标题】:How to read file using sharepoint REST API in Python如何在 Python 中使用 sharepoint REST API 读取文件
【发布时间】:2021-12-29 23:16:28
【问题描述】:

在使用 python 使用 REST API 时,我是一个绝对的初学者。我们收到了一个共享点 URL,它在“文档”部分的这些文件夹中包含多个文件夹和多个文件。我得到了一个“app_id”和一个“secret_token”。

我正在尝试访问 .csv 文件并将它们作为数据框读取并执行操作。 下载 .csv 并在本地完成后,操作代码已准备就绪,但我需要有关如何使用 python 连接共享点的帮助,这样我就不必再次下载如此繁重的文件了。

我知道已经有多个关于堆栈溢出的查询,但没有一个有助于到达我想要的地方。

我做了以下事情,但我不确定下一步该做什么:

import json
from office365.runtime.auth.user_credential import UserCredential
from office365.sharepoint.client_context import ClientContext
from office365.runtime.http.request_options import RequestOptions

site_url = "https://<company-name>.sharepoint.com"
ctx = ClientContext(site_url).with_credentials(UserCredential("{app_id}", "{secret_token}"))

上面的 site_url,我应该使用整个 URL 还是在 ####.com 之前都可以?

这就是我目前所拥有的,接下来我想从各个文件夹中读取文件并将它们转换为数据框?文件将始终为 .csv 格式

文件夹的示例层次结构如下:

文档 --> 文件夹 A、文件夹 B

文件夹 A --> a1.csv, a2.csv

文件夹 B --> b1.csv, b2.csv

我应该能够移动到我想要的任何文件夹并根据我的要求读取文件。

感谢您的帮助。

【问题讨论】:

    标签: python api rest sharepoint jupyter-notebook


    【解决方案1】:

    这对我有用,使用带有关联客户端 ID 和客户端密钥的 Sharepoint 应用程序标识。

    首先,我演示验证和读取特定文件,然后从文件夹中获取文件列表并读取第一个文件。

    import pandas as pd
    import json
    import io
    
    from office365.sharepoint.client_context import ClientCredential
    from office365.sharepoint.client_context import ClientContext
    from office365.sharepoint.files.file import File
    
    #Authentication (shown for a 'modern teams site', but I think should work for a company.sharepoint.com site:
    site="https://<myteams.companyname.com>/sites/<site name>/<sub-site name>"
    #Read credentials from a json configuration file:
    spo_conf = json.load(open(r"conf\spo.conf", "r")) 
    
    client_credentials = ClientCredential(spo_conf["RMAppID"]["clientId"],spo_conf["RMAppID"]["clientSecret"])
    ctx = ClientContext(site).with_credentials(client_credentials)
    
    
    #Read a specific CSV file into a dataframe:
    folder_relative_url = "/sites/<site name>/<sub site>/<Library Name>/<Folder Name>"
    filename = "MyFileName.csv"
    response = File.open_binary(ctx, "/".join([folder_relative_url, filename]))
    df = pd.read_csv(io.BytesIO(response.content))
    
    
    #Get a list of file objects from a folder and read one into a DataFrame:
    
    def getFolderContents(relativeUrl):
        contents = []
        library = ctx.web.get_list(relativeUrl)
        all_items = library.items.filter("FSObjType eq 0").expand(["File"]).get().execute_query()
        for item in all_items:  # type: ListItem
            cur_file = item.file
            contents.append(cur_file)
        return contents
    
    fldrContents = getFolderContents('/sites/<site name>/<sub site>/<Library Name>')
    response2 = File.open_binary(ctx, fldrContents[0].serverRelativeUrl)
    df2 = pd.read_csv(io.BytesIO(response2.content))
    

    一些参考资料:

    Related SO thread.

    Office365 library github site.

    Getting a list of contents in a doc library folder.


    关于 cmets 的补充说明:

    站点路径不包括站点主页的完整 URL(以 .aspx 结尾) - 它仅以站点(或子站点,如果与您的情况相关)的名称结尾。

    您无需使用配置文件来存储 Sharepoint 应用程序身份的身份验证凭据 - 您只需将 spo_conf["RMAppID"]["clientId"] 替换为 Sharepoint 生成的客户端 ID 的值,然后对客户端 Secret 执行类似操作。但这是一个 JSON 文件文本的简单示例:

    {
        "MyAppName":{
            "clientId": "my-client-id",
            "clientSecret": "my-client-secret",
            "title":"name_for_application"
        }
    } 
    

    【讨论】:

    • 嗨 - 我可以知道在这种情况下如何设置 json 配置文件。另外,对于site_url,我是否一直使用它直到“.aspx”,即完整的URL?
    • 感谢@BioData41 的回复,我现在试过了,它没有抛出任何错误,但是当我打印回复时,它给了我 403 代码,即禁止错误。即使我稍后尝试读取数据框,它也会给出相同的 403 禁止。
    • @trojanhorse,您确定创建应用程序身份的人设置了正确的权限,使其能够从网站的网络集合中读取吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2016-07-07
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2021-08-13
    • 2016-09-23
    相关资源
    最近更新 更多