pbixray Python Library
pbixray is an open source Python library for parsing Power BI .pbix files directly from Python, without Power BI Desktop or a live Analysis Services connection.
It is designed for developers who need to inspect semantic models, extract metadata, read Power Query logic, and work with the internals of PBIX files programmatically. The same API also supports Excel .xlsx files that contain embedded PowerPivot models.
Install
pip install pbixray
Quick Start
from pbixray import PBIXRay
model = PBIXRay("path/to/your_report.pbix")
print(model.tables)
print(model.metadata)
print(model.power_query)
print(model.dax_measures)
print(model.relationships)
Supported Inputs
- Power BI
.pbixfiles - Excel
.xlsxfiles with embedded PowerPivot models
Core Properties
These properties expose the most useful parts of a model as Python values or pandas DataFrames.
| Property | Returns |
|---|---|
model.tables | List of table names in the model |
model.metadata | Metadata about the Power BI configuration used to create the model |
model.power_query | DataFrame of Power Query / M expressions with TableName and Expression |
model.m_parameters | DataFrame of M parameter values and expressions |
model.size | Model size in bytes |
model.dax_tables | DataFrame of calculated tables and their DAX expressions |
model.dax_measures | DataFrame of measures including names, expressions, folders, and descriptions |
model.dax_columns | DataFrame of calculated columns and their expressions |
model.schema | DataFrame of table and column schema information with pandas types |
model.relationships | DataFrame of relationship definitions and cardinality details |
model.rls | DataFrame of row-level security roles and filter expressions |
model.statistics | DataFrame of column cardinality and storage statistics |
Common Examples
List tables
print(model.tables)
Read Power Query / M code
power_query = model.power_query
print(power_query[["TableName", "Expression"]])
Inspect measures
measures = model.dax_measures
print(measures[["TableName", "Name", "Expression"]])
Inspect calculated columns
columns = model.dax_columns
print(columns[["TableName", "ColumnName", "Expression"]])
Inspect relationships
relationships = model.relationships
print(
relationships[
[
"FromTableName",
"FromColumnName",
"ToTableName",
"ToColumnName",
"Cardinality",
"IsActive",
]
]
)
Inspect row-level security
rls = model.rls
print(rls[["RoleName", "TableName", "FilterExpression"]])
Read a table’s contents
sales = model.get_table("Sales")
print(sales.head())
Data Model Details
pbixray can be used both as a quick inspection tool and as a lower-level metadata extraction library.
Use it to:
- enumerate tables and columns in a semantic model
- inspect DAX calculated tables, measures, and calculated columns
- extract Power Query and M parameter definitions
- audit relationships, referential settings, and cross-filtering behavior
- review row-level security rules
- measure model size and storage statistics
Tabular Model Schema Endpoints
pbixray also exposes direct equivalents of many Analysis Services $System.TMSCHEMA_* DMVs by reading the embedded SQLite metadata database inside the PBIX.
| Property | DMV equivalent |
|---|---|
model.tmschema_model | TMSCHEMA_MODEL |
model.tmschema_tables | TMSCHEMA_TABLES |
model.tmschema_columns | TMSCHEMA_COLUMNS |
model.tmschema_partitions | TMSCHEMA_PARTITIONS |
model.tmschema_hierarchies | TMSCHEMA_HIERARCHIES |
model.tmschema_levels | TMSCHEMA_LEVELS |
model.tmschema_datasources | TMSCHEMA_DATASOURCES |
model.tmschema_perspectives | TMSCHEMA_PERSPECTIVES |
model.tmschema_perspective_tables | TMSCHEMA_PERSPECTIVE_TABLES |
model.tmschema_perspective_columns | TMSCHEMA_PERSPECTIVE_COLUMNS |
model.tmschema_perspective_hierarchies | TMSCHEMA_PERSPECTIVE_HIERARCHIES |
model.tmschema_perspective_measures | TMSCHEMA_PERSPECTIVE_MEASURES |
model.tmschema_kpis | TMSCHEMA_KPIS |
model.tmschema_annotations | TMSCHEMA_ANNOTATIONS |
model.tmschema_extended_properties | TMSCHEMA_EXTENDED_PROPERTIES |
model.tmschema_cultures | TMSCHEMA_CULTURES |
model.tmschema_translations | TMSCHEMA_OBJECT_TRANSLATIONS |
model.tmschema_linguistic_metadata | TMSCHEMA_LINGUISTIC_METADATA |
model.tmschema_query_groups | TMSCHEMA_QUERY_GROUPS |
model.tmschema_calculation_groups | TMSCHEMA_CALCULATION_GROUPS |
model.tmschema_calculation_items | TMSCHEMA_CALCULATION_ITEMS |
model.tmschema_calculation_expressions | TMSCHEMA_CALCULATION_EXPRESSIONS |
model.tmschema_variations | TMSCHEMA_VARIATIONS |
model.tmschema_attribute_hierarchies | TMSCHEMA_ATTRIBUTE_HIERARCHIES |
model.tmschema_sets | TMSCHEMA_SETS |
model.tmschema_refresh_policies | TMSCHEMA_REFRESH_POLICIES |
model.tmschema_detail_rows_definitions | TMSCHEMA_DETAIL_ROWS_DEFINITIONS |
model.tmschema_format_string_definitions | TMSCHEMA_FORMAT_STRING_DEFINITIONS |
model.tmschema_functions | TMSCHEMA_FUNCTIONS |
model.tmschema_calendars | TMSCHEMA_CALENDARS |
model.tmschema_calendar_column_groups | TMSCHEMA_CALENDAR_COLUMN_GROUPS |
model.tmschema_calendar_column_refs | TMSCHEMA_CALENDAR_COLUMN_REFERENCES |
model.tmschema_alternate_of | TMSCHEMA_ALTERNATE_OF |
model.tmschema_related_column_details | TMSCHEMA_RELATED_COLUMN_DETAILS |
model.tmschema_group_by_columns | TMSCHEMA_GROUP_BY_COLUMNS |
model.tmschema_binding_info | TMSCHEMA_BINDING_INFO |
model.tmschema_analytics_ai_metadata | TMSCHEMA_ANALYTICS_AI_METADATA |
model.tmschema_data_coverage_definitions | TMSCHEMA_DATA_COVERAGE_DEFINITIONS |
model.tmschema_role_memberships | TMSCHEMA_ROLE_MEMBERSHIPS |
TMSCHEMA examples
# List all columns with table names and hidden flags
print(model.tmschema_columns[["TableName", "Name", "DataType", "IsHidden"]])
# Inspect incremental refresh policies
print(model.tmschema_refresh_policies)
# Inspect security role memberships
print(model.tmschema_role_memberships)
Requirements
- Python 3.8+
- No Power BI Desktop required
- Works on macOS, Linux, and Windows