Reading and Writing STL Files

numpy-stl supports both ASCII and binary STL formats. Format detection is automatic when loading.

Loading a Single File

import stl
from stl import mesh

# Auto-detect format
m = mesh.Mesh.from_file('model.stl')

# Force a specific format
m = mesh.Mesh.from_file('model.stl', mode=stl.Mode.ASCII)
m = mesh.Mesh.from_file('binary_model.stl', mode=stl.Mode.BINARY)

Loading from a File Handle

from stl import mesh

with open('model.stl', 'rb') as fh:
    m = mesh.Mesh.from_file('model.stl', fh=fh)

Loading Multiple Solids (ASCII Only)

An ASCII STL file can contain multiple solid blocks. Use from_multi_file() to load each as a separate Mesh:

from stl import mesh

for m in mesh.Mesh.from_multi_file('multi.stl'):
    print(f'Solid: {m.name}, {len(m)} triangles')

Note

Multi-solid loading only works with ASCII STL files. Binary STL files always contain a single solid.

Combining Multiple Files

from_files() merges multiple STL files into a single mesh:

from stl import mesh

combined = mesh.Mesh.from_files(['part1.stl', 'part2.stl'])

Reading 3MF Files

Experimental support for reading 3MF files (read-only):

import pathlib
from stl import mesh

for m in mesh.Mesh.from_3mf_file(pathlib.Path('model.3mf')):
    print(f'{len(m)} triangles')

Saving

import stl
from stl import mesh

m = mesh.Mesh.from_file('input.stl')

# Binary (default, compact)
m.save('output.stl')

# ASCII (human-readable)
m.save('output.stl', mode=stl.Mode.ASCII)

Warning

The save method requires a binary file handle ('wb' mode) even when saving ASCII format. If you pass a text-mode handle, a TypeError is raised.