KiCadFiles documentation

A comprehensive Python library for parsing and manipulating KiCad file formats.

Features

  • Complete KiCad S-expression support: >200 classes representing KiCad tokens (missing tokens? create an issue with examples)

  • Type-safe parsing: Full Python type hints for all classes and methods

  • Flexible error handling: Three strictness modes (STRICT, FAILSAFE, SILENT)

  • Round-trip parsing: Parse KiCad files and convert back to S-expressions

  • Minimal dependencies: Self-contained S-expression parsing (no external dependencies)

Installation

pip install kicadfiles

Quick Start

Main File Format Classes

from kicadfiles import (
    KicadPcb, KicadSch, Footprint, KicadWks, KicadSymbolLib,
    KicadProject, KiCadDesignRules, FpLibTable, SymLibTable,
    ParseStrictness
)

# PCB board (.kicad_pcb)
pcb = KicadPcb.from_file("tests/fixtures/pcb/minimal.kicad_pcb", ParseStrictness.STRICT)
# pcb.save_to_file("output.kicad_pcb")  # Uncomment to save

# Schematic (.kicad_sch)
schematic = KicadSch.from_file("tests/fixtures/schematic/minimal.kicad_sch", ParseStrictness.STRICT)
# schematic.save_to_file("output.kicad_sch")  # Uncomment to save

# Footprint (.kicad_mod)
footprint = Footprint.from_file("tests/fixtures/footprints/small.kicad_mod", ParseStrictness.STRICT)
# footprint.save_to_file("output.kicad_mod")  # Uncomment to save

# Symbol library (.kicad_sym)
symbol_lib = KicadSymbolLib.from_file("tests/fixtures/symbols/small.kicad_sym", ParseStrictness.STRICT)
# symbol_lib.save_to_file("output.kicad_sym")  # Uncomment to save

# Worksheet (.kicad_wks)
worksheet = KicadWks.from_file("tests/fixtures/worksheets/small.kicad_wks", ParseStrictness.STRICT)
# worksheet.save_to_file("output.kicad_wks")  # Uncomment to save

# Project settings (.kicad_pro)
project = KicadProject.from_file("tests/fixtures/projects/minimal.kicad_pro", ParseStrictness.STRICT)
# project.save_to_file("output.kicad_pro")  # Uncomment to save

# Design rules (.kicad_dru)
design_rules = KiCadDesignRules.from_file("tests/fixtures/design_rules/minimal.kicad_dru", ParseStrictness.STRICT)
# design_rules.save_to_file("output.kicad_dru")  # Uncomment to save

# Footprint library table
fp_lib_table = FpLibTable.from_file("tests/fixtures/tables/fp-lib-table", ParseStrictness.STRICT)
# fp_lib_table.save_to_file("output-fp-lib-table")  # Uncomment to save

# Symbol library table
sym_lib_table = SymLibTable.from_file("tests/fixtures/tables/sym-lib-table", ParseStrictness.STRICT)
# sym_lib_table.save_to_file("output-sym-lib-table")  # Uncomment to save

Basic Usage

from kicadfiles import At, Layer, ParseStrictness

# Create objects using dataclass syntax
position = At(x=10.0, y=20.0, angle=90.0)
layer = Layer(name="F.Cu")

# Parse from S-expression
at_obj = At.from_sexpr("(at 10.0 20.0 90.0)", ParseStrictness.STRICT)

# Convert back to S-expression string
sexpr_str = at_obj.to_sexpr_str()
print(sexpr_str)  # Output: (at 10.0 20.0 90.0)

Parsing with Different Strictness Modes

from kicadfiles import At, ParseStrictness

# STRICT mode: Raises exceptions for any parsing errors
try:
    at_obj = At.from_sexpr("(at 10.0 20.0)", ParseStrictness.STRICT)
except ValueError as e:
    print(f"Parsing failed: {e}")

# FAILSAFE mode: Logs warnings and uses defaults for missing fields
at_obj = At.from_sexpr("(at 10.0 20.0)", ParseStrictness.FAILSAFE)
print(f"Angle defaulted to: {at_obj.angle}")  # Output: 0.0

# SILENT mode: Silently uses defaults for missing fields
at_obj = At.from_sexpr("(at 10.0 20.0)", ParseStrictness.SILENT)

Working with Complex Objects

from kicadfiles import Footprint, Pad, At, Size

# Create a footprint with pads
footprint = Footprint(
    library_link="Resistor_SMD:R_0603",
    at=At(x=50.0, y=30.0, angle=0.0),
    pads=[
        Pad(
            number="1",
            type="smd",
            shape="roundrect",
            at=At(x=-0.8, y=0.0),
            size=Size(width=0.7, height=0.9)
        ),
        Pad(
            number="2",
            type="smd",
            shape="roundrect",
            at=At(x=0.8, y=0.0),
            size=Size(width=0.7, height=0.9)
        )
    ]
)

# Convert to S-expression
sexpr = footprint.to_sexpr_str()
print(sexpr)

Indices and tables