All nodes/Data/DataFrame I/O
Read CSV
Reads a CSV file from the connected file_store (WebDAV) and converts it into a DataFrame. Parameters: delimiter, encoding, header row.
Type in the graph: df_read_csv
Exec
An error branch can be enabled (expose_error_output) to handle failures on their own path.
Ports can be split into separate execution and data handles.
Try it
Minimal working workflow
- Execute
- Execute + Data
Runs as pasted
When to use it
Takes a CSV file from a file store and turns it into a table (a DataFrame) — the payload the DF family works on: row filter, column select, group by.
The neighbouring File Read hands you the same file as plain text. Use that one when the content is needed as a string (a prompt, a template, a log), and this one when the next step is filtering, joining or aggregating by column.
How it works
“Connection source” defaults to “From the run context”: the node reads this workspace’s own store — the same tree the Files section browses. “Subfolder” narrows the root. If the file lives on an external WebDAV, switch to “External connection” and wire WebDAV Config or WS Store into the “File store” port that appears.
“File path” is a template rendered on every run, so
reports/{{ variables.session_id }}.csv reads a separate file per session.
The whole table travels downstream, while the run log and the node card show only a preview: the first 50 rows, the shape (rows × columns) and the column types.
Common mistakes
- Putting the table into text.
{{ nodes.<id>.output }}in a prompt or a template yieldsDataFrameEnvelope(rows=120, cols=5), not the data. To get text, add Convert to CSV or JSON. - A semicolon export from Excel. The delimiter defaults to
,; such a file needs;, or every row collapses into one column with a very long name. Legacy Cyrillic exports usually come in Windows-1251 as well. - “Header row index” set to -1. The header is not read, columns are named
0,1,2, and every later reference by column name stops matching. - A file over the limit. “Max bytes” (25 MiB by default) is not a refusal but a cut: you
get a partial table, flagged as
meta.truncatedin the preview. “Row limit” caps rows after parsing and saves no bytes. - The file does not exist yet. The step fails with a not-found error. If “there may be no file” is a normal case, enable “Error output” and route that branch separately.
Inputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
File storefile_store | Datadata | — | shown when connection_source ≠ "auto" |
Outputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Successoutput | Execute + Dataexecute_data | dataframe | |
Erroron_error | Execute + Dataexecute_data | — | shown when expose_error_output = true |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
File pathpath | string | "" | Path relative to the store root. Jinja templates are rendered per run, so ``reports/{{ variables.session_id }}.csv`` writes one file per session. supports templates |
Delimiterdelimiter | string | , | Column separator, usually ``,`` or ``;``. |
Text encodingencoding | string | utf-8 | Character encoding of the file. Use utf-8-sig when the CSV must open cleanly in Excel, cp1251 for legacy Cyrillic exports. Options: |
Header row indexheader_row | integer | 0 | Row index of the column header (0-based). Use -1 to skip the header. |
Connection sourceconnection_source | string | auto | Where this node gets its connection. 'From the run context' uses what the platform already knows (the Telegram bot this workflow is deployed to / this workspace's own file store) and needs no wiring. 'External connection' shows the resource port so a config node can be wired into it. Options: |
Subfolderstore_subfolder | string | "" | Optional folder inside this workspace's store to treat as the root, e.g. `reports` or `sessions/{{ variables.session_id }}`. Blank = the store root. supports templates shown when connection_source = auto |
| Advanced | |||
Row limitnrows_limit | integer | 0 | Maximum rows to read (0 = no limit). |
Max bytesmax_bytes | integer | 26214400 | Refuse to transfer more than this many bytes. |
Shared fields
Every node has these three — the platform adds them, not the node author.
expose_error_output— When enabled, show an execution output to connect nodes that run if this step fails.split_ports_in— Show separate execution and data input handles instead of one combined port.split_ports_out— Show separate execution and data output handles instead of one combined port.