Skip to main content

The unified Python SDK for Tableau workbook engineering

Project description

pytableau

What pandas did for tabular data, pytableau does for Tableau workbooks.

pytableau is the unified Python SDK for Tableau workbook engineering. It brings every layer of Tableau workbook manipulation — data, connections, semantic model, presentation, packaging, and server lifecycle — under one coherent, Pythonic API.

Why pytableau?

The Tableau Python ecosystem is fragmented. Tableau/Salesforce maintains several narrow libraries, each covering a single concern:

Library Layer Limitation
tableaudocumentapi Connection XML No calc fields, no viz edits, abandoned 2021
tableauhyperapi .hyper data files No XML awareness
pantab DataFrame ↔ .hyper bridge No XML awareness
tableauserverclient Server REST API No local file manipulation

pytableau wraps and integrates all of them behind a single API.

Install

# Core (XML + ZIP only — no optional dependencies)
pip install pytableau

# With Hyper / extract support
pip install "pytableau[hyper]"

# With pandas convenience methods
pip install "pytableau[pandas]"

# With Tableau Server/Cloud integration
pip install "pytableau[server]"

# Everything
pip install "pytableau[all]"

Quick Start

Open and inspect a workbook

from pytableau import Workbook

wb = Workbook.open("sales_dashboard.twbx")

print(wb.version)                    # "2024.1"
print(wb.datasources.names)          # ["Sales Data", "Parameters"]
print(wb.worksheets.names)           # ["Revenue by Region", "Trend"]
print(wb.dashboards.names)           # ["Executive Summary"]

catalog = wb.catalog()
for field in catalog.calculated_fields:
    print(f"{field.caption}: {field.formula}")

Swap database connections (CI/CD promotion)

from pytableau import Workbook

wb = Workbook.open("report.twbx")
for ds in wb.datasources:
    for conn in ds.connections:
        conn.server = "prod-db.corp.com"
        conn.dbname = "analytics_prod"
wb.save_as("report_prod.twbx")

Inject a DataFrame

from pytableau import Workbook
import pandas as pd

wb = Workbook.open("template.twbx")
df = pd.read_csv("fresh_data.csv")
wb.datasources["Sales Data"].hyper.from_dataframe(df)
wb.save_as("refreshed_report.twbx")

Generate a workbook from a template

from pytableau import Workbook
import pandas as pd

df = pd.read_csv("q4_revenue.csv")

wb = Workbook.from_template("bar_chart")
wb.datasources["__PLACEHOLDER_DS__"].hyper.from_dataframe(df)
wb.template.map_fields({
    "__DIMENSION__": "Product Category",
    "__MEASURE__":   "Revenue",
    "__COLOR__":     "Region",
})
wb.parameters["__PARAM_TITLE__"].value = "Q4 2025 Revenue"
wb.save_as("q4_report.twbx")

CLI

pytableau inspect workbook.twbx
pytableau diff before.twb after.twb
pytableau swap workbook.twb --server prod-db.corp.com --db analytics_prod

Development Status

Phase Description Status
0 Foundation: scaffolding, packaging, constants In Progress
1 Read & Inspect: parse any .twb/.twbx Planned
2 Connection & Field Mutation Planned
3 Data Layer: .hyper integration Planned
4 Template Engine Planned
5 Server Integration Planned
6 Advanced Features Planned

Design Principles

  1. Layer cake, not monolith. Each Tableau layer maps to a distinct submodule. Engage at any abstraction level.
  2. Batteries included, escape hatches available. The Pythonic API covers 90% of use cases; raw lxml nodes are always accessible.
  3. Template-first for presentation. Build a viz in Desktop, then parameterize it with pytableau.
  4. Fail loud, fail early. Validate XML mutations before writing — a corrupt .twb is the worst outcome.
  5. Dependency-light by default. Core requires only lxml. Hyper, server, and pandas are optional extras.
  6. Version-aware. Track Tableau Desktop version; warn on incompatible XML.

License

MIT — see LICENSE

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

pytableau-0.1.0.tar.gz (64.2 kB view details)

Uploaded Source

Built Distribution

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

pytableau-0.1.0-py3-none-any.whl (61.6 kB view details)

Uploaded Python 3

File details

Details for the file pytableau-0.1.0.tar.gz.

File metadata

  • Download URL: pytableau-0.1.0.tar.gz
  • Upload date:
  • Size: 64.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pytableau-0.1.0.tar.gz
Algorithm Hash digest
SHA256 36da5c65a5e163deed72c34982d65cab927cda11977f97fa4fbd643e2c46d717
MD5 b89cd07decb206fdc9753584081e2ad1
BLAKE2b-256 51c430e4d34e5d7e143039eab7baad625977a02daf216f8ec2940bd0c2095d2b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytableau-0.1.0.tar.gz:

Publisher: publish.yml on weisberg/pytableau

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

File details

Details for the file pytableau-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pytableau-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 61.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pytableau-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 06f0a57c8fab875f7b00e4a74da886a73e4100c7390dd041d9a06abde0848d52
MD5 d9cabe67ef04528190cd32727208faf4
BLAKE2b-256 1cfbb135728dbe64d73a3378c451f69e4f5dc9636842ceade3640ce71df08787

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytableau-0.1.0-py3-none-any.whl:

Publisher: publish.yml on weisberg/pytableau

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