Začínáme

Začněte vytvářet zabezpečené aplikace pomocí analyzátoru bankovních výpisů

Požadavky

Instalace

# Core install (deterministic parsers only)
pip install bankstatementparser

Volitelné rozšíření pro další funkce:

# Text-LLM path for digital PDFs (litellm + pypdf)
pip install 'bankstatementparser[hybrid]'

# Higher-fidelity table extraction (adds pdfplumber)
pip install 'bankstatementparser[hybrid-plus]'

# Vision-LLM path for scanned PDFs (adds pypdfium2)
pip install 'bankstatementparser[hybrid-vision]'

# LLM-powered transaction categorisation
pip install 'bankstatementparser[enrichment]'

# REST API microservice (FastAPI + uvicorn)
pip install 'bankstatementparser[api]'

# Optional Polars DataFrame support
pip install 'bankstatementparser[polars]'

Rychlý start

Automatická detekce a parsování libovolného strukturovaného formátu

from bankstatementparser import create_parser, detect_statement_format

fmt = detect_statement_format("transactions.ofx")
parser = create_parser("transactions.ofx", fmt)
df = parser.parse()  # pandas DataFrame
print(df.head())

Funguje se soubory .xml (CAMT/PAIN.001), .csv, .ofx, .qfx, .mt940 a .sta.

Parsování CAMT.053

from bankstatementparser import CamtParser

parser = CamtParser("statement.xml")
transactions = parser.parse()

Parsování PAIN.001

from bankstatementparser import Pain001Parser

parser = Pain001Parser("payment.xml")
payments = parser.parse()

Parsování PDF bankovních výpisů (hybridní pipeline)

Hybridní pipeline inteligentně směruje PDF třemi extrakčními cestami:

from bankstatementparser.hybrid import smart_ingest

result = smart_ingest("statement.pdf")
print(result.source_method)         # "deterministic" | "llm" | "vision"
print(result.verification.status)   # VERIFIED | DISCREPANCY | FAILED
print(result.transactions)          # List of extracted transactions

Každá extrakce je ověřena pomocí Golden Rule: opening + credits − debits == closing.

Streaming velkých souborů

U souborů s tisíci transakcemi použijte streaming pro omezenou spotřebu paměti:

parser = CamtParser("large_statement.xml")
for transaction in parser.parse_streaming(redact_pii=True):
    process(transaction)  # Memory stays constant

Parsování v paměti

Parsování z bajtů bez diskových I/O — užitečné pro SFTP nebo API workflows:

xml_bytes = download_from_sftp()
parser = CamtParser.from_bytes(xml_bytes, source_name="daily.xml")
transactions = parser.parse()

Paralelní zpracování souborů

Parsování více souborů současně:

from bankstatementparser import parse_files_parallel

results = parse_files_parallel([
    "statements/jan.xml",
    "statements/feb.xml",
    "statements/mar.xml",
])
for r in results:
    print(r.path, r.status, len(r.transactions), "rows")

Hromadné skenování adresářů

Zpracování celých adresářových stromů s automatickou deduplikací:

from bankstatementparser.hybrid import scan_and_ingest

batch = scan_and_ingest("statements/2026/", pattern="**/*.pdf")
print(f"Processed: {len(batch.results)} files")
print(f"Unique transactions: {batch.unique_count}")

Deduplikace

Idempotentní transakční hashe pro bezpečné inkrementální zpracování:

from bankstatementparser import CamtParser, Deduplicator

parser = CamtParser("statement.xml")
dedup = Deduplicator()
result = dedup.deduplicate(dedup.from_dataframe(parser.parse()))

print(f"Unique: {len(result.unique_transactions)}")
print(f"Exact duplicates: {len(result.exact_duplicates)}")
print(f"Suspected matches: {len(result.suspected_matches)}")

Kategorizace transakcí (obohacení)

Automatická kategorizace transakcí pomocí LLM klasifikace:

from bankstatementparser.enrichment import Categorizer

categorizer = Categorizer()
enriched = categorizer.categorize_batch(transactions)
for txn in enriched:
    print(f"{txn.description}: {txn.category}")

Export do účetnictví (hledger / beancount)

Export transakcí do formátů plaintext-accounting deníků:

from bankstatementparser.export import to_hledger, to_beancount

journal = to_hledger(transactions, account="Assets:Bank:Checking")
beancount_journal = to_beancount(transactions, account="Assets:Bank:Checking")

Multi-měnové ověření zůstatku

Ověření zůstatků nezávisle pro každou měnovou skupinu:

from bankstatementparser.hybrid import verify_balance_multi_currency

results = verify_balance_multi_currency(transactions)
for currency, verification in results.items():
    print(f"{currency}: {verification.status}")

REST API

Nasazení jako FastAPI mikroservis:

# Start the API server
bankstatementparser-api --port 8000

# For container deployments
bankstatementparser-api --host 0.0.0.0 --port 9000

Endpointy:

Bezpečné zpracování ZIP

Zpracování zazipovaných XML souborů s vestavěnými bezpečnostními kontrolami (ochrana proti bombám, odmítnutí šifrovaných záznamů):

from bankstatementparser import iter_secure_xml_entries, CamtParser

for entry in iter_secure_xml_entries("statements.zip"):
    parser = CamtParser.from_bytes(entry.xml_bytes, source_name=entry.source_name)
    print(f"{entry.source_name}: {len(parser.parse())} transactions")

Export

parser = CamtParser("statement.xml")
parser.export_csv("output.csv")
parser.export_json("output.json")

# Polars (requires bankstatementparser[polars])
polars_df = parser.to_polars()

# Excel
parser.camt_to_excel("output.xlsx")

Použití CLI

# Parse structured formats
bankstatementparser --type camt --input statement.xml
bankstatementparser --type pain001 --input payment.xml

# Hybrid PDF pipeline
bankstatementparser --type ingest --input statement.pdf
bankstatementparser --type ingest --input statement.pdf --output ledger.csv

# Interactive review mode
bankstatementparser --type review --input result.json
bankstatementparser --type review --input result.json --output reviewed.json

# Export to CSV with streaming
bankstatementparser --type camt --input statement.xml --output transactions.csv
bankstatementparser --type camt --input statement.xml --streaming --show-pii

Možnosti CLI:

Nastavení lokálního vývoje

git clone https://github.com/sebastienrousseau/bankstatementparser.git
cd bankstatementparser
python3 -m venv .venv && source .venv/bin/activate
pip install poetry && poetry install --with dev
make install-hooks   # pre-commit hook runs `make verify` before every commit

Spuštění testů:

pytest

Reference API

Třídy parserů

Třída Formát Import
CamtParser CAMT.053 (ISO 20022) from bankstatementparser import CamtParser
Pain001Parser PAIN.001 (ISO 20022) from bankstatementparser import Pain001Parser
CsvStatementParser CSV from bankstatementparser import CsvStatementParser
OfxParser OFX from bankstatementparser import OfxParser
QfxParser QFX from bankstatementparser import QfxParser
Mt940Parser MT940 from bankstatementparser import Mt940Parser
smart_ingest() PDF (hybridní pipeline) from bankstatementparser.hybrid import smart_ingest

Utility funkce

Funkce Účel
detect_statement_format(path) Automatická detekce formátu souboru
create_parser(path, fmt) Vytvoření správného parseru
parse_files_parallel(paths) Parsování více souborů současně
iter_secure_xml_entries(zip_path) Bezpečná iterace přes ZIP záznamy
smart_ingest(path) Hybridní PDF extrakce s ověřením
scan_and_ingest(dir, pattern) Hromadné skenování adresářů
verify_balance_multi_currency(txns) Ověření zůstatku per měna
to_hledger(txns, account) Export do formátu hledger
to_beancount(txns, account) Export do formátu beancount

Datové třídy

Třída Účel
Deduplicator Detekce duplicitních transakcí
DeduplicationResult Výsledek s unikátními, přesnými a podezřelými shodami
InputValidator Validace cest a formátů souborů
Transaction Normalizovaný záznam transakce
FileResult Výsledek paralelního parsování
ZipXMLSource Wrapper pro ZIP člen
IngestResult Výsledek hybridního pipeline s ověřením
VerificationResult Výsledek ověření zůstatku
Categorizer LLM kategorizace transakcí
AccountMapper Regex mapovací pravidla účtů

Výjimky

Výjimka Kdy je vyvolána
ParserError Selhání parsování
ExportError Selhání exportu (CSV/JSON/Excel)
ValidationError Selhání validace vstupu
ZipSecurityError Selhání bezpečnostní kontroly ZIP