Skip to main content

A Python library to parse and analyze PBIX files used with Microsoft Power BI and Excel PowerPivot.

Project description

PBIXRay

Downloads

Overview

PBIXRay is a Python library designed to parse and analyze PBIX files, which are used with Microsoft Power BI. This library provides a straightforward way to extract valuable information from PBIX files, including tables, metadata, Power Query code, and more.

This library is the Python implementation of the logic embedded in the DuckDB extension duckdb-pbix-extension.

Note: PBIXRay also supports Excel (XLSX) files with embedded PowerPivot models. You can use the same API to extract and analyze data models from XLSX files that contain PowerPivot data.

Installation

Install with pip:

pip install pbixray

Getting Started

To start using PBIXRay, import the module and initialize it with the path to your PBIX file:

from pbixray import PBIXRay

model = PBIXRay('path/to/your/file.pbix')

Large models (on-disk loading)

By default the entire decompressed data model is held in memory. For models whose uncompressed size approaches or exceeds available RAM, pass on_disk=True: the decompressed data is streamed to a temporary file and memory-mapped, so only the pages a requested table actually touches are faulted in. Use temp_dir to control where the spill file is created (defaults to the system temp directory).

# Spill to disk + mmap instead of holding everything in RAM.
with PBIXRay('path/to/large.pbix', on_disk=True, temp_dir='/fast/scratch') as model:
    df = model.get_table('Sales')
# leaving the `with` block releases the mapping and removes the temp file

PBIXRay is also a context manager; model.close() (or exiting the with block) deterministically releases the memory map and the metadata connection. When on_disk=False (the default) behavior is unchanged. Metadata (DAX, TMSCHEMA_*, etc.) is loaded lazily on first access, so simply opening a file is cheap.

Features and Usage

Tables

To list all tables in the model:

tables = model.tables
print(tables)

Metadata

To get metadata about the Power BI configuration used during model creation:

metadata = model.metadata
print(metadata)

Power Query

To display all M/Power Query code used for data transformation, in a dataframe with TableName and Expression columns:

power_query = model.power_query
print(power_query)

M Parameters

To display all M Parameters values in a dataframe with ParameterName, Description, Expression and ModifiedTime columns:

m_parameters = model.m_parameters
print(m_parameters)

Model Size

To find out the model size in bytes:

size = model.size
print(f"Model size: {size} bytes")

DAX Calculated Tables

To view DAX calculated tables in a dataframe with TableName and Expression columns:

dax_tables = model.dax_tables
print(dax_tables)

DAX Measures

To access DAX measures in a dataframe with TableName, Name, Expression, DisplayFolder, and Description columns:

dax_measures = model.dax_measures
print(dax_measures)

Calculated Columns

To access calculated column DAX expressions in a dataframe with TableName,ColumnName and Expression columns:

dax_columns = model.dax_columns
print(dax_columns)

Schema

To get details about the data model schema and column types in a dataframe with TableName, ColumnName, and PandasDataType columns:

schema = model.schema
print(schema)

Relationships

To get the details about the data model relationships in a dataframe with FromTableName, FromColumnName, ToTableName, ToColumnName, IsActive, Cardinality, CrossFilteringBehavior, FromKeyCount, ToKeyCount and RelyOnReferentialIntegrity columns:

relationships = model.relationships
print(relationships)

Row-Level Security (RLS)

To get the details about Row-Level Security roles and permissions in a dataframe with TableName, RoleName, RoleDescription, FilterExpression, State and MetadataPermission columns:

rls = model.rls
print(rls)

Get Table Contents

To retrieve the contents of a specified table:

table_name = 'YourTableName'
table_contents = model.get_table(table_name)
print(table_contents)

To decode only a subset of columns from a wide table (decoding the others is skipped), pass columns:

table_contents = model.get_table(table_name, columns=['ProductKey', 'Sales'])

Dictionary decode runs on a native Huffman kernel (xmhuffman) and fans out across cores automatically for large dictionaries.

Statistics

To get statistics about the model, including column cardinality and byte sizes of dictionary, hash index, and data components, in a dataframe with columns TableName, ColumnName, Cardinality, Dictionary, HashIndex, and DataSize:

statistics = model.statistics
print(statistics)

Connections

Reports expose their Connections manifest — the list of data connections declared by the report — as a list of dictionaries:

print(model.connections)

Self-contained (import) models usually return an empty list.

Live-connection (thin) reports

Some .pbix files are thin reports with no embedded model: they live-connect to an external Analysis Services server (analysisServicesDatabaseLive) or a Power BI Service dataset (pbiServiceLive). Because the model lives on a remote server, there is nothing to extract on disk, and constructing PBIXRay raises LiveConnectionError. The exception carries the parsed connection details so you can still identify what the report points at:

from pbixray import PBIXRay, LiveConnectionError, NoEmbeddedModelError

try:
    model = PBIXRay("thin-report.pbix")
except LiveConnectionError as e:
    print(e.connection_type)   # e.g. 'pbiServiceLive'
    print(e.database_name)     # remote dataset id, when available
    print(e.connections)       # full manifest (list of dicts)

The exception hierarchy is LiveConnectionErrorNoEmbeddedModelErrorPBIXRayError. NoEmbeddedModelError is raised when a file has no model and no connection manifest. Both also subclass RuntimeError for backward compatibility.

Tabular Model Schema (TMSCHEMA) Endpoints

Full equivalents of the Analysis Services $System.TMSCHEMA_* DMVs, read directly from the embedded SQLite metadata database.

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
# Example — list all columns with their tables
print(model.tmschema_columns[["TableName", "Name", "DataType", "IsHidden"]])

# Example — inspect incremental refresh policies
print(model.tmschema_refresh_policies)

# Example — list all security roles and their members
print(model.tmschema_role_memberships)

Roadmap

Planned optimizations for very large models (Arrow output, direct zip-member mmap, RecordBatch streaming) are tracked in ROADMAP.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pbixray-0.12.0.tar.gz (70.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pbixray-0.12.0-py3-none-any.whl (66.7 kB view details)

Uploaded Python 3

File details

Details for the file pbixray-0.12.0.tar.gz.

File metadata

  • Download URL: pbixray-0.12.0.tar.gz
  • Upload date:
  • Size: 70.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pbixray-0.12.0.tar.gz
Algorithm Hash digest
SHA256 1354296fa8fe245094c1b1fb009294fe15b4094cfa9a3ca4074818b21ee2553c
MD5 d75df735427ec4a8ede221fdd2b2d74d
BLAKE2b-256 b636220b413d8789e192ae9cebfb8d9d3f25f9e4dc5a507da16d03ebf5f712c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for pbixray-0.12.0.tar.gz:

Publisher: publish.yml on Hugoberry/pbixray

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pbixray-0.12.0-py3-none-any.whl.

File metadata

  • Download URL: pbixray-0.12.0-py3-none-any.whl
  • Upload date:
  • Size: 66.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pbixray-0.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5186526d9ee223cdff6983b0b2d89051e09dd65ba859c96f01bad56904e1cf29
MD5 c668db2947f9f318715fa0c73e2b331f
BLAKE2b-256 f2f54fe08315b283dd4f26a42f8de927a57fc336fb71c197c645f77d985feb77

See more details on using hashes here.

Provenance

The following attestation bundles were made for pbixray-0.12.0-py3-none-any.whl:

Publisher: publish.yml on Hugoberry/pbixray

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page