Skip to content

felix-martel/grob

Repository files navigation

grob

Release Build status Commit activity License

Group files together in a flexible way using glob-like patterns.

pip install grob

In its simplest form, grob simply lists all files in a directory:

~ grob "*" .
[
  "examples/one_tag_same_dir/root/image_001.png",
  "examples/one_tag_same_dir/root/image_002.jpg",
  "examples/one_tag_same_dir/root/image_003.gif"
]

given the following directory content:

root
├── image_001.png
├── image_002.jpg
└── image_003.gif

However, grob is mainly useful to group different files together. Let's say you have images and corresponding JSON description for each image:

root
├── image_1.png
├── image_2.png
├── image_3.png
├── labels_1.json
├── labels_2.json
└── labels_3.json
~ grob "image=image_{id}.png,labels=labels_{id}.json" .
{
    "1": {"image": "image_1.png", "labels": "labels_1.json"},
    "2": {"image": "image_2.png", "labels": "labels_2.json"},
    "3": {"image": "image_3.png", "labels": "labels_3.json"}
}

Now imagine each group of inputs is stored in the same subdirectory:

root
├── group_a
│   ├── image.png
│   └── labels.json
├── group_b
│   ├── image.png
│   └── labels.json
├── group_c
│   ├── image.png
│   └── labels.json
└── group_d
    ├── image.png
    └── labels.json

We just need to update our pattern:

~ grob "image=group_{name}/*.png,labels=group_{name}/*.json" .
{
    "a": {"image": "group_a/image.png", "labels": "group_a/labels.json"},
    "b": {"image": "group_b/image.png", "labels": "group_b/labels.json"},
    "c": {"image": "group_c/image.png", "labels": "group_c/labels.json"},
    "d": {"image": "group_d/image.png", "labels": "group_d/labels.json"}
}

What if each type of file lives in its own directory?

root
├── images
│   ├── fifi.gif
│   ├── loulou.png
│   └── riri.jpg
└── labels
    ├── fifi.json
    ├── loulou.json
    └── riri.json
~ grob "image=images/{name}.*,labels={name}.json" .
{
    "riri": {"image": "images/riri.jpg", "labels": "labels/riri.json"},
    "fifi": {"image": "images/fifi.gif", "labels": "labels/fifi.json"},
    "loulou": {"image": "images/loulou.png", "labels": "labels/loulou.json"}
}

See more in the Examples section, or check tests/examples/.

Contribute

Install the environment and the pre-commit hooks with

make install

Run tests:

make tests
# Alternatively, you can directly run `pytest`

Run code quality tools:

make check

Repository initiated with fpgmaas/cookiecutter-poetry.