Directories
Organize a dataset's images in virtual directories: list them, read the tree, count images, and create, rename or delete directories. No image files move.
A dataset’s images sit in directories: a label on each image, not a storage location, so
moving images is instant. A directory is addressed by its path, which REST puts in the URL
(/train/cars is .../directories/road-signs/train/cars).
list
The dataset’s directories, or only those directly inside parent.
Source: Directories.list
| Arg | Type | Default | Notes |
|---|---|---|---|
dataset |
str |
required | Dataset name or id |
parent |
str | None |
None |
Only the directories directly inside this path ("" for the root) |
directories = client.directories.list(
dataset="road-signs",
parent="",
)
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=" \
-H "X-API-Key: $PICTOGRAPH_API_KEY"
Returns Sequence[Directory]
Directory · 11 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
nested_image_count: int = 0
created_by: str | None = None
created_at: datetime | None = None
updated_at: datetime | None = None
tree
The whole tree in one request, each node with its children.
Source: Directories.tree
| Arg | Type | Default | Notes |
|---|---|---|---|
dataset |
str |
required | Dataset name or id |
tree = client.directories.tree(dataset="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 · 6 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
nested_image_count: int = 0
children: list[DirectoryTreeNode] = []
stats
Counts for one directory, its subdirectories included by default.
Source: Directories.stats
| Arg | Type | Default | Notes |
|---|---|---|---|
dataset |
str |
required | Dataset name or id |
directory |
str |
required | Directory path, e.g. /train/cars (leading slash optional) |
include_subdirectories |
bool |
True |
Include its subdirectories |
stats = client.directories.stats(
dataset="road-signs",
directory="/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
Create a directory and any missing parents; an existing directory is returned as is. Needs a
member key.
Source: Directories.create
| Arg | Type | Default | Notes |
|---|---|---|---|
dataset |
str |
required | Dataset name or id |
directory |
str |
required | Path to create, e.g. /train/positive |
directory = client.directories.create(
dataset="road-signs",
directory="/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": "/train/positive"}'
Returns Directory
Directory · 11 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
nested_image_count: int = 0
created_by: str | None = None
created_at: datetime | None = None
updated_at: datetime | None = None
rename
Rename a directory; everything inside moves with it. Needs a member key.
Source: Directories.rename
| Arg | Type | Default | Notes |
|---|---|---|---|
dataset |
str |
required | Dataset name or id |
directory |
str |
required | Path of the directory to rename |
new_name |
str |
required | New name, one path segment; 409 if a sibling has it |
directory = client.directories.rename(
dataset="road-signs",
directory="/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 · 11 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
nested_image_count: int = 0
created_by: str | None = None
created_at: datetime | None = None
updated_at: datetime | None = None
delete
Delete an empty directory. cascade=True first moves its images to its parent. Needs an
admin key.
Source: Directories.delete
| Arg | Type | Default | Notes |
|---|---|---|---|
dataset |
str |
required | Dataset name or id |
directory |
str |
required | Path of the directory to delete, e.g. /train |
cascade |
bool |
False |
Move its images to the parent first; without it, a non-empty directory is a 409 |
client.directories.delete(
dataset="road-signs",
directory="/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 |
A key below member (create, rename) or admin (delete) |
| 404 | NotFoundError |
The dataset or directory doesn’t exist in your organization |
| 409 | ConflictError |
rename to a sibling’s name, or delete of a non-empty directory without cascade |