# Source.read
URL: https://lsd.tools/docs/api-source-read
Updated: 2026-07-17

## Example

Inside a load step, `read()` turns whatever the user picked into rows:

```python
from lsdtools import Tool, Source, Table

tool = Tool("io")

@tool.load(source_kinds=("file",))
def load_it(src: Source) -> Table:
    return src.read()
```

Or drive a load directly from a value source:

```python
Source.file("assays.csv").read()      # → a Table
```

## Notes

Files are read by extension — `.csv` via CSV, `.parquet` / `.pq` via Parquet — and custom
kinds run their registered reader. Every call returns a **new** immutable
[`Table`](/docs/api-table).

## See also

**API:** [paths](/docs/api-source-paths) · [file](/docs/api-source-file) · [sql](/docs/api-source-sql) · [Table](/docs/api-table)

**Guides:** [Load steps](/docs/tools-load) · [Tables & data flow](/docs/tools-tables)
