csv.register_dialect
A module-wide dict from names to validated dialects. register_dialect adds or replaces a name, get_dialect looks one up, list_dialects lists them in registration order, unregister_dialect removes one.
Demo
import csv csv.register_dialect('pipes', delimiter='|') try: result = (csv.list_dialects(), csv.get_dialect('pipes').delimiter) finally: csv.unregister_dialect('pipes') result
New names are added after the three built-in ones (registration order). The settings are validated when you register, so an empty delimiter fails right there with TypeError: "delimiter" must be a 1-character string — and nothing is registered. get_dialect returns the validated _csv.Dialect; an unknown name raises csv.Error: unknown dialect (shown as _csv.Error).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| name | str | yes | The name to register (must be a str). |
| dialect | str | Dialect | no (None) | A Dialect class/instance or another registered name to start from; None starts from the excel defaults. |
| fmtparams | keyword arguments | no | delimiter=, quotechar=, quoting= … applied on top. Validated immediately. |
Return value
None — register_dialect and unregister_dialect return None; get_dialect returns a _csv.Dialect; list_dialects a list of names.
Common patterns
import csv csv.register_dialect('pipes', delimiter='|', quoting=csv.QUOTE_MINIMAL) with open('data.psv', newline='', encoding='utf-8') as f: rows = list(csv.reader(f, dialect='pipes'))
import csv class Pipes(csv.excel): delimiter = '|' csv.register_dialect('pipes', Pipes)
import csv if 'pipes' not in csv.list_dialects(): csv.register_dialect('pipes', delimiter='|')
Examples
Pitfalls
import csv class Pipes(csv.excel): delimiter = '|' csv.register_dialect('pipes', Pipes) try: Pipes.delimiter = ';' d = csv.get_dialect('pipes').delimiter finally: csv.unregister_dialect('pipes') d
import csv class Pipes(csv.excel): delimiter = '|' csv.register_dialect('pipes', Pipes) try: Pipes.delimiter = ';' csv.register_dialect('pipes', Pipes) d = csv.get_dialect('pipes').delimiter finally: csv.unregister_dialect('pipes') d
import csv csv.reader([], dialect='excel_tab')
import csv csv.reader([], dialect='excel-tab').dialect.delimiter
When to use
- A custom format used across a code base by name
- Configuration that names a format as a string
- Library code: the registry is global — pass a Dialect class instead of registering names others might clash with
Notes
FAQ
csv.list_dialects() — ['excel', 'excel-tab', 'unix'] plus any names registered in the running program.