Skip to content

anonymise_directory

from voxelkit.dicom import anonymise_directory

summary = anonymise_directory(
    input_dir="./incoming_studies/",
    output_dir="./anonymised/",
)
print(summary["files_anonymised"], "files scrubbed")

Scrubs PHI tags from every .dcm file under input_dir and writes clean copies to output_dir. The source tree is never touched. Non-DICOM files are skipped, and the directory structure is mirrored exactly.


Signature

def anonymise_directory(
    input_dir: str | Path,
    output_dir: str | Path,
    *,
    recursive: bool = True,
) -> AnonymiseSummary

Parameters

Parameter Type Default Description
input_dir str or Path required Source directory to read from
output_dir str or Path required Destination directory for the cleaned files
recursive bool True Whether to descend into subdirectories

The function raises ValueError upfront if input_dir and output_dir resolve to the same path, to prevent overwriting source data.


Return value

{
    "total_dcm_files": 312,
    "files_anonymised": 310,
    "failures": ["series_b/corrupt.dcm"],
    "scrubbed_tag_counts": {
        "PatientName": 310,
        "PatientID": 310,
        "PatientBirthDate": 305,
    },
    "input_dir": "/abs/path/incoming_studies",
    "output_dir": "/abs/path/anonymised"
}

The function never raises mid-run. If a file is corrupt or unreadable it goes into failures and the rest of the dataset still gets processed.


Example

from voxelkit.dicom import anonymise_directory

summary = anonymise_directory(
    input_dir="./incoming_studies/",
    output_dir="./anonymised/",
)

print(f"Scrubbed {summary['files_anonymised']} of {summary['total_dcm_files']} files")

if summary["failures"]:
    print("These files could not be processed:")
    for f in summary["failures"]:
        print(" ", f)