Skip to main content

Flexible file explorers and filters for navigating neuroimaging datasets and beyond.

Project description

PyPI version Python versions License CI

nifti-finder

Navigate neuroimaging datasets (and more) using flexible file explorers and filters. Optimized for typical neuroimaging research workflows, including BIDS-structured datasets.

Key features

  • Flexible file discovery with glob-based pattern matching for any dataset structure.
  • Rich set of composable filters for precise dataset querying (by file extension, prefix/suffix, regex, existence of related files, etc.).
  • Extensible design with modular, reusable interfaces for creating custom explorers and filters

Installation

pip install nifti-finder
# or from source
pip install -e .

Quickstart

Get all NIfTI files from any nested dataset

from nifti_finder.explorers import NeuroExplorer

from your_package import preprocess

# Default: finds all .nii and .nii.gz files
explorer = NeuroExplorer()

for path in explorer.scan("/path/to/dataset"):
    preprocess(path)

Track subject-level progress in BIDS-style datasets

explorer = NeuroExplorer(
    outer="sub-*",              # level to compute progress (e.g., root/sub-*/...)
    inner="**/anat/*T1w.nii*",  # rest (e.g., ses-*/anat/T1w.nii.gz)
)

for path in explorer.scan("/path/to/dataset", progress=True, desc="Subjects"):
    preprocess(path)

Output:

Subjects:  50%|███████████████████▌               | 30/60 [00:15<00:15,  2.00 it/s]

Exclude subjects with missing data; e.g., a segmentation mask

from nifti_finder.filters import IncludeIfFileExists

explorer = NeuroExplorer(
    outer="sub-*",
    inner="**/anat/*T1w.nii*",
    filters=[
        IncludeIfFileExists(
            filename_pattern="*seg*", # require a segmentation mask
            search_in="/labels",      # in a parallel labels/ tree
            mirror_relative_to="/path/to/dataset",
        )
    ],
)

for path in explorer.scan("/path/to/dataset"):
    preprocess(path)

API Overview

  • Explorers
    • AllPurposeFileExplorer - general-purpose scanning with patterns + filters.
    • NeuroExplorer - two-stage scanning (outer/inner) with patterns + filters + progress tracking, optimized for neuroimaging workflows.
  • Filters
    • Include/Exclude: Extension, FilePrefix, FileSuffix, FileRegex, DirectoryPrefix/Suffix/Regex, IfFileExists
    • Filters can be combined with logical operators (AND/OR).
  • Mixins & Interfaces
    • BasicFileExplorer & TwoStageFileExplorer for file traversal
    • MaterializeMixin — utilities to list, deduplicate, sort, batch, or count matches.
    • FilterableMixin — add, remove, and compose filters dynamically.

Extended Examples

Use with non-NIfTI files (e.g., JSON)

explorer = NeuroExplorer(outer="sub-*", inner="**/*.json")
for p in explorer.scan("/path/to/bids", progress=True, desc="Subjects"):
    print(p)

Explorers support multiple patterns and filters, but will traverse once per pattern.

General-purpose exploration

If you don’t want to assume any nested (subject/... or dataset/subject/...) hierarchy, use AllPurposeFileExplorer for flexible scanning.

from nifti_finder.explorers import AllPurposeFileExplorer

explorer = AllPurposeFileExplorer(pattern="*.json")

for path in explorer.scan("/path/to/dataset"):
    print(path)

Materialize results

Both NeuroExplorer and AllPurposeExplorer provide convenience methods to turn the streaming output of scan() into concrete Python data structures.

This is useful when you want:

  • A list of paths (with optional sorting, deduplication, or limiting)
  • A single path (first match)
  • A quick boolean check
  • A count
  • Iteration in batches
explorer = NeuroExplorer(outer="sub-*", inner="**/anat/*T1w.nii*")
paths = explorer.list("/path/to/dataset", sort=True, unique=True)

Chainable filtering

Both NeuroExplorer and AllPurposeExplorer allow include/exclude filters to refine results.

from nifti_finder.filters import IncludeExtension, ExcludeDirPrefix

explorer = AllPurposeFileExplorer(
    pattern="**/*.nii*",
    filters=[
        ExcludeFileSuffix("preprocessed"),              # drop already preprocessed files
        ExcludeDirPrefix("bad"),                        # drop 'bad' files
        IncludeIfFileExists(filename_pattern="*mask*"), # keep if a brain mask exists in same directory
    ],
    logic="AND",                                        # combination logic
)

for path in explorer.scan("/path/to/dataset"):
    preprocess(path)

Filters can be dynamically adjusted.

explorer.add_filters(ExcludeFileSuffix("mask"))
explorer.remove_filters(ExcludeFileSuffix("mask"))
explorer.clear_filters()

Filters can be composed together to get their own combination logic.

from nifti_finder.filters import ComposeFilter, ExcludeFilePrefix

suffix_filter = ComposeFilter(
    filters=[ExcludeFileSuffix("bet"), ExcludeFileSuffix("mask")],
    logic="OR"
)
prefix_filter = ComposeFilter(
    filters=[ExcludeFileSuffix("pet"), ExcludeFileSuffix("dwi")],
    logic="OR"
)
filename_filter = ComposeFilter(
    filters=[suffix_filter, prefix_filter],
    logic="AND"
)
explorer.add_filters(filename_filter)

Development

# Setup
pip install -e .[test]

# Run tests
pytest -q

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nifti_finder-1.1.0.tar.gz (18.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nifti_finder-1.1.0-py3-none-any.whl (20.4 kB view details)

Uploaded Python 3

File details

Details for the file nifti_finder-1.1.0.tar.gz.

File metadata

  • Download URL: nifti_finder-1.1.0.tar.gz
  • Upload date:
  • Size: 18.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for nifti_finder-1.1.0.tar.gz
Algorithm Hash digest
SHA256 f3c3e3665ace9077cec5bd010df49434f06a99e01b76a111e0b4d79889b82c61
MD5 dd98b00f46c2b86bf17ea36cea4e9d67
BLAKE2b-256 10f418f33f5a916ef43beccfdb9e21f6035912fd84ee0a9be54712003116c861

See more details on using hashes here.

File details

Details for the file nifti_finder-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: nifti_finder-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 20.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for nifti_finder-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9f49629e9bdec9e6ed18c5af93db3961fe950e92c3978aa17c99256c6179297f
MD5 185ddf7e33a9ffd26d103915cff0f5af
BLAKE2b-256 62330648769ad82398e1d8c6c7c407b9682bd7a74a0017f068672b178b9e9db6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page