// Docs

LeRobot reader

Read LeRobot datasets as episode rows

Use read_lerobot when your input is already a LeRobot dataset root.

import refiner as mdr

pipeline = mdr.read_lerobot(
    "hf://datasets/lerobot/aloha_sim_transfer_cube_human",
)

Each output row is a LeRobotRow: one episode with metadata, frame data, and video references attached.

What gets loaded

read_lerobot reads:

Dataset pathUsed for
meta/info.jsonDataset fps, robot type, feature metadata, paths.
meta/stats.jsonExisting feature statistics, when present.
meta/tasks.parquetTask index to task text mapping.
meta/episodes/...Episode-level rows.
data/...Frame-level parquet slices referenced by episodes.
videos/...Video files referenced lazily through row video views.

Videos are not decoded when the dataset is read. They are decoded or copied when a transform or writer needs frames.

Multiple inputs

Pass multiple roots to combine datasets:

pipeline = mdr.read_lerobot(
    [
        "hf://datasets/acme/pick-cubes-a",
        "hf://datasets/acme/pick-cubes-b",
    ]
)

The reader merges metadata and remaps task indices so row tasks stay consistent. For a full recipe, see Merge LeRobot Datasets.

Malformed episodes

read_lerobot validates that each episode's declared frame count matches the frames loaded from its frame parquet. Mismatches raise by default. To drop those episodes instead, pass skip_malformed_rows=True; the reader warns once and records malformed_lerobot_episodes_skipped.

Inspecting rows

row = pipeline.take(1)[0]

print(row.episode_id)
print(row.tasks)
print(row.to_frame_table().names)
print(list(row.videos))

Read Episode Rows and Frames and Videos for the row API.

Sharding options

pipeline = mdr.read_lerobot(
    "hf://datasets/acme/large-demo-set",
    target_shard_bytes=256 * 1024 * 1024,
    num_shards=64,
)

The shard options apply to episode parquet files under meta/episodes.