Sign in Get started

Directories

Inspect and edit a dataset's virtual directory tree - list, tree, stats, create, rename, delete.

View as Markdown

Pictograph organizes a dataset’s images into virtual directories. A directory is a label on the image, not a physical location, so moving an image between directories never rewrites stored bytes.

In REST, the directory path is part of the URL: /train/cars becomes .../directories/road-signs/train/cars.

Datasets and directories are addressed by name and path; a UUID is accepted anywhere a name is. A dataset outside your organization returns 404.

list

Direct children of parent_path (use "" for the root), or every directory in the dataset when parent_path is omitted.

Source: Directories.list

Arg Type Default Notes
dataset_name str required Dataset name.
parent_path str | None None None = all directories; "" = root-level only; a path = that directory’s children
directories = client.directories.list(
    dataset_name="road-signs",
    parent_path="",
)
for d in directories:
    print(d.full_path, d.image_count)
pictograph directories list road-signs --parent ""
curl -s "https://api.pictograph.io/api/v1/developer/directories/road-signs?parent_path=" \
  -H "X-API-Key: $PICTOGRAPH_API_KEY"

Returns Sequence[Directory]

Directory · 10 fields
class Directory(BaseModel):
    """A single virtual directory in a dataset."""
    id: str
    dataset_id: str
    organization_id: str | None = None
    name: str
    parent_directory_id: str | None = None
    full_path: str
    image_count: int = 0
    created_by: str | None = None
    created_at: datetime | None = None
    updated_at: datetime | None = None

tree

The whole hierarchy in one request, each node carrying its children. Use this to render a sidebar instead of walking list level by level.

Source: Directories.tree

Arg Type Default Notes
dataset_name str required Dataset name.
tree = client.directories.tree(
    dataset_name="road-signs",
)
for node in tree:
    print(node.name, len(node.children))
pictograph directories tree road-signs
curl -s "https://api.pictograph.io/api/v1/developer/directories/road-signs/tree" \
  -H "X-API-Key: $PICTOGRAPH_API_KEY"

Returns Sequence[DirectoryTreeNode]

DirectoryTreeNode · 5 fields
class DirectoryTreeNode(BaseModel):
    """A node in the hierarchical directory tree (children nested recursively)."""
    id: str
    name: str
    full_path: str
    image_count: int = 0
    children: list[DirectoryTreeNode] = []

stats

Image statistics for one directory, rolling up its subdirectories by default.

Source: Directories.stats

Arg Type Default Notes
dataset_name str required Dataset name.
directory_path str required Directory path, e.g. /train/cars. Leading slash optional.
include_subdirectories bool True Roll up subdirectories too
stats = client.directories.stats(
    dataset_name="road-signs",
    directory_path="/train/cars",
    include_subdirectories=True,
)
print(stats.total_images, stats.total_directories, stats.total_size_bytes)
pictograph directories stats road-signs /train/cars
curl -s "https://api.pictograph.io/api/v1/developer/directories/road-signs/train/cars/stats?include_subdirectories=true" \
  -H "X-API-Key: $PICTOGRAPH_API_KEY"

Returns DirectoryStats

DirectoryStats · 4 fields
class DirectoryStats(BaseModel):
    """Aggregate image statistics for a directory (and, by default, its subdirectories)."""
    total_directories: int
    total_images: int
    total_size_bytes: int
    directories_by_status: dict[str, int] = {}

create

Idempotent: creating an existing path returns it. Missing parents are auto-created, the same way an upload into a directory path does, so use this to pre-stage an empty structure ahead of uploads. Requires member+ role.

Source: Directories.create

Arg Type Default Notes
dataset_name str required Dataset name.
directory_path str required Full virtual path to create, e.g. "/train/positive".
directory = client.directories.create(
    dataset_name="road-signs",
    directory_path="/train/positive",
)
print(directory.id, directory.full_path)
pictograph directories create road-signs /train/positive
curl -s -X POST "https://api.pictograph.io/api/v1/developer/directories/" \
  -H "X-API-Key: $PICTOGRAPH_API_KEY" -H "Content-Type: application/json" \
  -d '{"dataset": "road-signs", "directory_path": "/train/positive"}'

Returns Directory

Directory · 10 fields
class Directory(BaseModel):
    """A single virtual directory in a dataset."""
    id: str
    dataset_id: str
    organization_id: str | None = None
    name: str
    parent_directory_id: str | None = None
    full_path: str
    image_count: int = 0
    created_by: str | None = None
    created_at: datetime | None = None
    updated_at: datetime | None = None

rename

The directory row, every descendant directory’s path, and every contained image’s directory path move together in one call. No bytes move. new_name is a single path segment, not a path. A sibling with that name is a 409. Requires member+ role.

Source: Directories.rename

Arg Type Default Notes
dataset_name str required Dataset name.
directory_path str required Full virtual path of the directory to rename.
new_name str required The new name (a single path segment, not a path).
directory = client.directories.rename(
    dataset_name="road-signs",
    directory_path="/train/cars",
    new_name="negatives",
)
pictograph directories rename road-signs /train/cars negatives
curl -s -X PATCH "https://api.pictograph.io/api/v1/developer/directories/road-signs/train/cars/rename" \
  -H "X-API-Key: $PICTOGRAPH_API_KEY" -H "Content-Type: application/json" \
  -d '{"new_name": "negatives"}'

Returns Directory

Directory · 10 fields
class Directory(BaseModel):
    """A single virtual directory in a dataset."""
    id: str
    dataset_id: str
    organization_id: str | None = None
    name: str
    parent_directory_id: str | None = None
    full_path: str
    image_count: int = 0
    created_by: str | None = None
    created_at: datetime | None = None
    updated_at: datetime | None = None

delete

Empty-only by default. cascade=True first moves the directory’s images to its parent, then deletes. Requires member+ role.

Source: Directories.delete

Arg Type Default Notes
dataset_name str required Dataset name.
directory_path str required Virtual directory path, leading slash, e.g. /train.
cascade bool False Move the directory’s images up to its parent, then delete. Without it a non-empty directory is a 409.
client.directories.delete(
    dataset_name="road-signs",
    directory_path="/train/cars",
    cascade=True,
)
pictograph directories delete road-signs /train/cars --cascade --yes
curl -s -X DELETE "https://api.pictograph.io/api/v1/developer/directories/road-signs/train/cars?cascade=true" \
  -H "X-API-Key: $PICTOGRAPH_API_KEY"

Returns None

Common errors

Status Exception Cause
403 ForbiddenError No access to the organization, or a mutation without member+ role
404 NotFoundError Dataset or directory does not exist in your organization
409 ConflictError rename target name already exists as a sibling
Copied to clipboard