Skip to content

DICOMweb

pydcm.dicomweb is a QIDO / WADO / STOW / DELETE client over the native HTTP stack — query, retrieve (streaming), store and delete against a remote server.

Query (QIDO-RS)

from pydcm import dicomweb

studies  = dicomweb.search_studies("https://pacs.example.com",
                                   matches={"PatientID": "42"})
series   = dicomweb.search_series("https://pacs.example.com", study_uid)
instances = dicomweb.search_instances("https://pacs.example.com", study_uid, series_uid)

Pass includefields=[...] to widen the returned attributes and auth=... for a bearer/basic credential.

Retrieve (WADO-RS)

# whole objects
parts = dicomweb.retrieve_study("https://pacs.example.com", study_uid)   # list[bytes] Part-10
inst  = dicomweb.retrieve_instance("https://pacs.example.com", study_uid, series_uid, sop_uid)

# streaming — bounded memory over a large study
for part10 in dicomweb.iter_study("https://pacs.example.com", study_uid):
    ds = pydcm.dcmread(io.BytesIO(part10))

Other retrieve shapes: retrieve_series, retrieve_frames, retrieve_*_metadata, retrieve_rendered, retrieve_bulkdata. Pass transfer_syntax=... to negotiate the wire encoding.

Store (STOW-RS)

result = dicomweb.store_instances(
    "https://pacs.example.com",
    [open("ct.dcm", "rb").read()],
)

Delete

dicomweb.delete_instance("https://pacs.example.com", study_uid, series_uid, sop_uid)
dicomweb.delete_series("https://pacs.example.com", study_uid, series_uid)
dicomweb.delete_study("https://pacs.example.com", study_uid)