You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python DataFrame中加载ODATA?两类调用问题求助

我来帮你搞定用Python读取OData并生成DataFrame的问题,咱们逐个分析你遇到的问题:

方法1:修复pyodata的使用问题

你看到的<<bound method Service.http_get_odata...>>这个输出,其实是因为你只打印了Service的方法对象,却没有实际调用它来拉取数据。正确的使用步骤应该是这样的:

  1. 先初始化带认证的请求会话
  2. 创建OData服务实例
  3. 定位到对应的实体集
  4. 执行查询获取数据,再转成DataFrame

给你写好完整的示例代码:

import pyodata
import requests
import pandas as pd

# 配置OData服务地址和认证信息
SERVICE_URL = 'https://xxx/sap/opu/odata/sap/Table_0001'
http_session = requests.Session()
http_session.auth = ('username', 'password')
http_session.verify = False  # 提醒:生产环境尽量不要关闭SSL验证,建议配置证书

# 创建OData服务客户端
service = pyodata.Client(SERVICE_URL, http_session)

# 获取目标实体集(名称要和你之前拿到的EntitySets里的一致,也就是'Table_0001')
target_entity_set = service.entity_sets.Table_0001

# 查询所有数据(如果需要过滤、排序可以在这里加条件,比如.filter(...))
data_entries = target_entity_set.get_entities().execute()

# 把每条数据转成字典后生成DataFrame
df = pd.DataFrame([entry.raw for entry in data_entries])
print(df.head())

方法2:修复requests的URL问题

你用requests成功连接后只拿到了实体集列表,是因为你请求的是OData服务的根地址,这个地址只会返回服务包含的实体集信息,不会返回具体数据。你需要把URL指向实体集的具体数据路径:

举个例子,原来的URL是https://xxx/opu/odata/Table_0001/?$format=json,你需要在后面加上实体集名称,变成https://xxx/opu/odata/Table_0001/Table_0001/?$format=json(因为你的实体集名称就是'Table_0001')。

完整代码如下:

import requests
import pandas as pd

# 修正后的URL:服务根地址 + 实体集名称
url = 'https://xxx/opu/odata/Table_0001/Table_0001/?$format=json'
response = requests.get(url, auth=('Username', 'Password'), verify=False)

print(f"请求状态码:{response.status_code}")
if response.status_code == 200:
    # OData的实际数据都在'd'->'results'节点下
    json_data = response.json()
    df = pd.DataFrame(json_data['d']['results'])
    print(df.head())
else:
    print(f"请求失败,详情:{response.text}")

为什么Excel能正常加载?

因为Excel的OData连接器会自动识别服务根地址返回的实体集列表,然后自动请求对应实体集的数据路径,相当于帮你做了补全URL的步骤,而代码里需要你手动指定到具体的实体集数据地址。

内容的提问来源于stack exchange,提问作者Bruno05

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:22:46