>>>fromhanselimportCrumb# create the crumb>>>crumb=Crumb("{base_dir}/data/raw/{subject_id}/{session_id}/{image_type}/{image}")# set the base_dir path>>>crumb=crumb.replace(base_dir='/home/hansel')>>>print(str(crumb))/home/hansel/data/raw/{subject_id}/{session_id}/{image_type}# get the ids of the subjects>>>subj_ids=crumb['subject_id']>>>print(subj_ids)['0040000','0040001','0040002','0040003','0040004','0040005',...# get the paths to the subject folders, the output can be strings or crumbs,# you choose with the ``make_crumbs`` boolean argument. Default: True.>>>subj_paths=crumb.ls('subject_id',make_crumbs=True)>>>print(subj_paths)[Crumb("/home/hansel/data/raw/0040000/{session_id}/{image_type}/{image}"),Crumb("/home/hansel/data/raw/0040001/{session_id}/{image_type}/{image}"),Crumb("/home/hansel/data/raw/0040002/{session_id}/{image_type}/{image}"),Crumb("/home/hansel/data/raw/0040003/{session_id}/{image_type}/{image}"),Crumb("/home/hansel/data/raw/0040004/{session_id}/{image_type}/{image}"),...# set the image_type>>>anat_crumb=crumb.replace(image_type='anat_1')>>>print(anat_crumb)/home/hansel/data/raw/{subject_id}/{session_id}/anat_1/{image}# get the paths to the images inside the anat_1 folders>>>anat_paths=anat_crumb.ls('image')>>>print(anat_paths)[Crumb("/home/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040002/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040003/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040004/session_1/anat_1/mprage.nii.gz"),...# get the ``session_id`` of each of these ``anat_paths``>>>sessions=[cr['session_id']forcrinanat_paths]>>>print(sessions)['session_1','session_1','session_1','session_1','session_1',...# if you don't want the the output to be ``Crumbs`` but string paths:>>>anat_paths=anat_crumb.ls('image',make_crumbs=False)>>>print(anat_paths)["/home/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz","/home/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz","/home/hansel/data/raw/0040002/session_1/anat_1/mprage.nii.gz","/home/hansel/data/raw/0040003/session_1/anat_1/mprage.nii.gz","/home/hansel/data/raw/0040004/session_1/anat_1/mprage.nii.gz",...# you can also use a list of ``fnmatch`` expressions to ignore certain files patterns# using the ``ignore_list`` argument in the constructor.# For example, the files that start with '.'.>>>crumb=Crumb("{base_dir}/data/raw/{subject_id}/{session_id}/{image_type}/{image}",>>>ignore_list=['.*'])

>>>crumb['image_type']='anat_1'# get the paths to the images inside the anat_1 folders>>>anat_paths=crumb.ls('image')>>>print(anat_paths)[Crumb("/home/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040002/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040003/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040004/session_1/anat_1/mprage.nii.gz"),...

Remember that I can still access the replaced crumb arguments in each of the previous
crumbs in anat_paths.

unfold the whole crumb path to get the whole filetree in a list of paths:

>>>all_images=Crumb("/home/hansel/raw/{subject_id}/{session_id}/{modality}/{image}")>>>all_images=crumb.unfold()>>>print(all_images)[Crumb("/home/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040000/session_1/rest_1/rest.nii.gz"),Crumb("/home/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040001/session_1/rest_1/rest.nii.gz"),Crumb("/home/hansel/data/raw/0040002/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040002/session_1/rest_1/rest.nii.gz"),Crumb("/home/hansel/data/raw/0040003/session_1/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040003/session_1/rest_1/rest.nii.gz"),...# and you can ask for the value of the crumb argument in each element>>>print(crumbs[0]['subject_id'])0040000

Use re.match or fnmatch expressions to filter the paths:

The syntax for crumb arguments with a regular expression is: "{<arg_name>:<reg_regex>}"

# only the session_0 folders>>>s0_imgs=Crumb("/home/hansel/raw/{subject_id}/{session_id:*_0}/{modality}/{image}")>>>s0_imgs=crumb.unfold()>>>print(s0_imgs)[Crumb("/home/hansel/data/raw/0040000/session_0/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040000/session_0/rest_1/rest.nii.gz"),Crumb("/home/hansel/data/raw/0040001/session_0/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040001/session_0/rest_1/rest.nii.gz"),...

The default is for fnmatch expressions. If you prefer using re.match for filtering,
set the regex argument to 're' in the constructor.

# only the ``session_0`` folders>>>s0_imgs=Crumb("/home/hansel/raw/{subject_id}/{session_id:^.*_0$}/{modality}/{image}",>>>regex='re')>>>s0_imgs=crumb.unfold()>>>print(s0_imgs)[Crumb("/home/hansel/data/raw/0040000/session_0/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040000/session_0/rest_1/rest.nii.gz"),Crumb("/home/hansel/data/raw/0040001/session_0/anat_1/mprage.nii.gz"),Crumb("/home/hansel/data/raw/0040001/session_0/rest_1/rest.nii.gz"),...

More functionalities, ideas and comments are welcome.

Dependencies

Please see the requirements.txt file. Before installing this package,
install its dependencies with:

pip install -r requirements.txt

Install

It works on Python 3.4, 3.5 and 2.7. For Python 2.7 install pathlib2 as well.

This package uses setuptools. You can install it running:

python setup.py install

If you already have the dependencies listed in requirements.txt
installed, to install in your home directory, use:

python setup.py install --user

To install for all users on Unix/Linux:

python setup.py build
sudo python setup.py install

You can also install it in development mode with:

python setup.py develop

Development

Code

Github

You can check the latest sources with the command:

git clone https://www.github.com/alexsavio/hansel.git

or if you have write privileges:

git clone git@github.com:alexsavio/hansel.git

If you are going to create patches for this project, create a branch
for it from the master branch.