如何从Power BI数据集读取数据至Python并导出为Pandas DataFrame
解决思路:从Power BI数据集导出到Pandas DataFrame
方案1:使用Power BI REST API + Pandas
通过Power BI官方REST API直接查询数据集,无需依赖adodbapi,步骤如下:
- 先在Azure AD注册应用,分配
Dataset.Read.All权限,获取租户ID、客户端ID和密钥 - 调用接口获取访问令牌,再用DAX查询目标数据集
- 将返回的JSON结果解析为Pandas DataFrame
示例代码:
import requests import pandas as pd # 替换为你的实际参数 tenant_id = "你的租户ID" client_id = "Azure AD应用ID" client_secret = "应用密钥" dataset_id = "目标数据集ID" group_id = "工作区ID(数据集在工作区时必填)" # 获取访问令牌 token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token" token_payload = { "grant_type": "client_credentials", "client_id": client_id, "client_secret": client_secret, "scope": "https://analysis.windows.net/powerbi/api/.default" } token_res = requests.post(token_url, data=token_payload) access_token = token_res.json()["access_token"] # 构造DAX查询(替换为你的表名) dax_query = """ EVALUATE '目标数据表' """ # 调用API查询数据 api_url = f"https://api.powerbi.com/v1.0/myorg/groups/{group_id}/datasets/{dataset_id}/executeQueries" headers = {"Authorization": f"Bearer {access_token}", "Content-Type": "application/json"} query_payload = { "queries": [{"query": dax_query}], "serializerSettings": {"includeNulls": True} } res = requests.post(api_url, json=query_payload, headers=headers) result = res.json() # 转换为DataFrame table_rows = result["results"][0]["tables"][0]["rows"] df = pd.DataFrame(table_rows)
方案2:Windows环境下用pywin32操控Power BI Desktop
如果你的环境是Windows,可通过COM接口直接操作Power BI Desktop导出数据:
- 确保安装Power BI Desktop和pywin32库
- 打开目标pbix文件,通过COM对象读取数据集表数据
示例代码:
import win32com.client import pandas as pd # 启动Power BI Desktop pbi_app = win32com.client.Dispatch("PowerBI.Application") # 打开本地pbix文件 pbix_path = r"C:\你的文件路径\目标文件.pbix" report = pbi_app.Open(pbix_path) # 获取目标表数据(替换为你的表名) model = report.Model target_table = model.Tables("目标数据表") columns = [col.Name for col in target_table.Columns] # 转换为DataFrame data_rows = [] for row in target_table.Rows: data_rows.append([row[col] for col in columns]) df = pd.DataFrame(data_rows, columns=columns) # 关闭Power BI Desktop pbi_app.Quit()
方案3:直接从Dataflows导出文件后读取
如果是低频取数需求,可直接在Power BI服务端操作:
- 进入Dataflows页面,找到目标实体(表)
- 点击「导出」选择CSV或Parquet格式下载
- 用Pandas直接读取本地文件:
import pandas as pd # 读取CSV df = pd.read_csv("下载的文件路径.csv") # 读取Parquet(需安装pyarrow或fastparquet) # df = pd.read_parquet("下载的文件路径.parquet")
方案4:借助Microsoft Fabric Lakehouse(需对应订阅)
如果有Power BI Premium或Microsoft Fabric订阅,可将Dataflows数据同步到Lakehouse的Delta表,再通过Fabric API或直接连接Lakehouse读取数据,适合长期高频取数场景。
内容的提问来源于stack exchange,提问作者Julius
相关产品推荐
相关产品推荐

