如何将列表数据从 SharePoint Online 下载到 csv(最好)或 json 文件?

How to download list data from SharePoint Online to a csv (preferably) or json file?

我已使用 Python 访问 SharePoint Online 中的列表,并希望将列表数据保存到文件(csv 或 json)以对其进行转换并对一些元数据进行排序以进行迁移

我可以完全访问我正在连接的 Sharepoint 站点(客户端 ID、密码..)。

from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.runtime.client_request import ClientRequest
from office365.sharepoint.client_context import ClientContext

我已经设置了我的设置:

app_settings = {
     'url': 'https://company.sharepoint.com/sites/abc',
     'client_id': 'id',
     'client_secret': 'secret'
}

连接到站点:

context_auth = AuthenticationContext(url=app_settings['url'])
context_auth.acquire_token_for_app(client_id=app_settings['client_id'],
client_secret=app_settings['client_secret'])
ctx = ClientContext(app_settings['url'], context_auth)

获取列表并检查标题:

lists = ctx.web.lists
ctx.load(lists)
ctx.execute_query()
for lista in lists:
    print(lista.properties["Title"])  # this gives me the titles of each list and it works.

lists 是一个 ListCollection Object

从前面的代码中,我看到我想要获得标题为:“分析 A”的列表:

a1 = lists.get_by_title("Analysis A")
ctx.load(a1)
ctx.execute_query()  # a1 is a List item - non-iterable

然后我得到那个列表中的数据:

a1w = a1.get_items()
ctx.load(a1w)
ctx.execute_query() # a1w is a ListItemCollection - iterable

想法 1:df 到 json/csv

df1 = pd.DataFrame(a1w) #doens't work)

想法 2:

关注此 link:

我在执行 json.loads 命令时出错:

JSONDecodeError: Extra data: line 1 column 5 (char 4)

备选方案:

我试过 Shareplum,但无法连接,就像我在 office365 上一样-python-rest。我的猜测是它没有带有客户端 ID 和客户端密码的授权选项(据我所知)

你会怎么做?还是我遗漏了什么?

想法 1

如果没有错误跟踪,很难判断哪里出了问题。但我怀疑这可能与您作为参数传递的格式错误的数据有关。请参阅文档中的 here 以准确了解预期内容。

也请考虑使用相关的堆栈错误跟踪来更新您的问题。

想法 2

JSONDecodeError: Extra data: line 1 column 5 (char 4)

此错误仅表示 Json 字符串不是有效格式。您可以使用 this 服务验证 JSON 字符串。这通常会告诉您错误点,然后您可以使用它来手动修复问题。

如果正在解析的对象是 python 对象,也可能导致此错误。您可以通过 jsonifying 每行

来避免这种情况
data_list= []
for line in open('file_name.json', 'r'):
    data_list.append(json.loads(line))

这避免了存储中间 python 对象。如果没有任何效果,另请参阅此 related issue

示例测试演示供您参考。

context_auth = AuthenticationContext(url=app_settings['url'])
context_auth.acquire_token_for_app(client_id=app_settings['client_id'],
client_secret=app_settings['client_secret'])
ctx = ClientContext(app_settings['url'], context_auth)

list = ctx.web.lists.get_by_title("ListA")
items = list.get_items()
ctx.load(items)
ctx.execute_query()

dataList = []
for item in items:
     dataList.append({"Title":item.properties["Title"],"Created":item.properties["Created"]})
     print("Item title: {0}".format(item.properties["Title"]))
pandas.read_json(json.dumps(dataList)).to_csv("output.csv", index = None,header=True)