# Python Microsoft Fabric API - Files

onelake\_list, onelake\_read, onelake\_write and onelake\_delete, and the two forms a file path takes.

A connection has four methods for files. They read and write OneLake directly, which is where every lakehouse stores its tables and files, and the `Files` section in the lakehouse explorer is the folder they work in. They use a second token, for storage, not for the Fabric API, which the connection obtains and refreshes the same way as the first.

## File paths {#file-paths}

Every path starts with the lakehouse and continues into it, and the lakehouse can be named in two ways:

| Form | Example |
| --- | --- |
| Name and type | `Operations.Lakehouse/Files/incoming/payments-2026-03.csv` |
| Item ID | `66666666-7777-8888-9999-000000000000/Files/incoming/payments-2026-03.csv` |

Both forms work in every method below. `Files` is where a lakehouse keeps files, and `Tables` next to it is where its tables are stored, which the [table methods](https://zato.io/docs/dev/examples/cloud/fabric/api/tables.html) write to.

## onelake\_list {#onelake_list}

```python
conn.onelake_list(workspace_id, directory='')
```

Lists what is directly under a path - files and subfolders, without going into the subfolders.

| Parameter | Type | Meaning |
| --- | --- | --- |
| `workspace_id` | str | The workspace whose storage to list |
| `directory` | str | The folder to list, e.g. `Operations.Lakehouse/Files/incoming`, or empty for the top of the workspace |

Returns a dict with `paths`, a list of dicts each with `name` (the full path), `isDirectory` (`true` or `false`), `contentLength` and `lastModified`.

```python
# -*- coding: utf-8 -*-

# Zato
from zato.server.service import Service

class ListFiles(Service):

    def handle(self):

        workspace_id = '11111111-2222-3333-4444-555555555555'

        conn = self.microsoft.fabric['My Fabric']

        listing = conn.onelake_list(workspace_id, 'Operations.Lakehouse/Files/incoming')

        files = []
        for path in listing['paths']:
            file = {'name': path['name'], 'is_directory': path['isDirectory']}
            files.append(file)

        self.response.payload = {'files': files}
```

```json
{"files": [{"name": "Operations.Lakehouse/Files/incoming/payments-2026-03.csv", "is_directory": false}]}
```

## onelake\_read {#onelake_read}

```python
conn.onelake_read(workspace_id, file_path)
```

Returns a file's contents as bytes.

| Parameter | Type | Meaning |
| --- | --- | --- |
| `workspace_id` | str | The workspace the file is in |
| `file_path` | str | The file, in either path form |

```python
# -*- coding: utf-8 -*-

# Zato
from zato.server.service import Service

class ReadFile(Service):

    def handle(self):

        workspace_id = '11111111-2222-3333-4444-555555555555'
        file_path = 'Operations.Lakehouse/Files/incoming/payments-2026-03.csv'

        conn = self.microsoft.fabric['My Fabric']

        data = conn.onelake_read(workspace_id, file_path)
        text = data.decode('utf-8')

        size = len(data)
        lines = text.splitlines()
        first_line = lines[0]

        self.response.payload = {'size': size, 'first_line': first_line}
```

```json
{"size": 142, "first_line": "invoice_id,location,insurer,amount,status,sent_at"}
```

## onelake\_write {#onelake_write}

```python
conn.onelake_write(workspace_id, file_path, data)
```

Creates a file with these bytes, or replaces it if it exists. Missing folders in the path are created.

| Parameter | Type | Meaning |
| --- | --- | --- |
| `workspace_id` | str | The workspace to write to |
| `file_path` | str | The file, in either path form |
| `data` | bytes | The contents |

Returns nothing.

```python
# -*- coding: utf-8 -*-

# Zato
from zato.server.service import Service

class WriteFile(Service):

    def handle(self):

        workspace_id = '11111111-2222-3333-4444-555555555555'
        file_path = 'Operations.Lakehouse/Files/exports/invoices-2026-03.csv'

        conn = self.microsoft.fabric['My Fabric']

        text = 'location,invoiced\nRiverside,2895.50\nOak Hill,1840.00\nMaple Grove,415.75\n'
        data = text.encode('utf-8')

        conn.onelake_write(workspace_id, file_path, data)

        self.response.payload = {'bytes': len(data)}
```

## onelake\_delete {#onelake_delete}

```python
conn.onelake_delete(workspace_id, file_path)
```

Deletes a file.

| Parameter | Type | Meaning |
| --- | --- | --- |
| `workspace_id` | str | The workspace the file is in |
| `file_path` | str | The file, in either path form |

Returns nothing. Deleting a file that does not exist raises an exception.

```python
# -*- coding: utf-8 -*-

# Zato
from zato.server.service import Service

class DeleteFile(Service):

    def handle(self):

        workspace_id = '11111111-2222-3333-4444-555555555555'
        file_path = 'Operations.Lakehouse/Files/incoming/payments-2026-03.csv'

        conn = self.microsoft.fabric['My Fabric']

        conn.onelake_delete(workspace_id, file_path)
```

## See also {#see-also}

- [Tables](https://zato.io/docs/dev/examples/cloud/fabric/api/tables.html) - Turning a written file into a table with load\_table
- [Sending and receiving files](https://zato.io/docs/dev/examples/cloud/fabric/files.html) - Loading an incoming file and writing a monthly export
- [Connection](https://zato.io/docs/dev/examples/cloud/fabric/api/connection.html) - The storage token these methods use

## Learn more {#learn-more}

- [Development documentation](https://zato.io/docs/dev/) - Everything about writing services, in one place
- [Requests and responses](https://zato.io/docs/dev/request-response/) - What a service receives, what it returns and how to shape both
- [Integration examples](https://zato.io/docs/dev/examples/) - Ready-made code for the systems you are likely to connect to
- [IDE and debugging](https://zato.io/docs/dev/ide/) - Write services in the Dashboard or in your own editor
- [Data models](https://zato.io/docs/dev/model/) - Declare inputs and outputs and have them validated for you
- [In-depth API tutorial](https://zato.io/tutorials/main/01.html) - The full platform tutorial, from installation to production patterns
