如何通过pynetdicom的send_c_find获取并保存StudyInstanceUID
解决C-FIND请求无法获取StudyInstanceUID的问题
明确说明:完全可以保存StudyInstanceUID字段,你遇到的问题大概率是查询请求未指定返回该字段,或者访问方式有误,以下是具体解决步骤:
1. 在C-FIND查询中明确请求StudyInstanceUID
pynetdicom的C-FIND遵循DICOM查询规则,必须在请求数据集里声明需要返回的字段,否则服务器不会主动返回。示例代码如下:
from pynetdicom import AE, QueryModel from pynetdicom.sop_class import StudyRootQueryRetrieveInformationModelFind # 初始化应用实体 ae = AE() ae.add_requested_context(StudyRootQueryRetrieveInformationModelFind) # 构建查询数据集,指定要返回的字段 ds = QueryModel.StudyRoot # 设置查询条件(示例:匹配所有患者) ds.PatientName = '*' # 声明需要获取StudyInstanceUID,设为空字符串表示请求返回该字段 ds.StudyInstanceUID = '' # 连接Orthanc服务器 assoc = ae.associate('你的OrthancIP', 你的Orthanc端口) if assoc.is_established: # 发送C-FIND请求 responses = assoc.send_c_find(ds, query_model='STUDY_ROOT') for status, identifier in responses: # 0xFF00和0xFF01表示查询有匹配结果 if status.Status in (0xFF00, 0xFF01): # 提取并保存StudyInstanceUID if 'StudyInstanceUID' in identifier: study_uid = identifier.StudyInstanceUID # 示例:保存到文本文件 with open('study_uids.txt', 'a', encoding='utf-8') as f: f.write(f"{study_uid}\n") # 也可以保存到数据库或变量中 print(f"已保存StudyInstanceUID: {study_uid}") # 释放连接 assoc.release() else: print("无法连接到Orthanc服务器")
2. 用更可靠的方式访问字段
如果直接用关键字StudyInstanceUID访问失败,可以尝试用DICOM标签((0x0020, 0x000D))访问,这是该字段的标准唯一标识,不会出错:
if (0x0020, 0x000D) in identifier: study_uid = identifier[(0x0020, 0x000D)].value
3. 检查Orthanc配置(可选)
Orthanc默认会返回所有标准DICOM字段,但若你修改过配置文件中的DicomModalities或QueryRetrieveLevel相关限制,需确保未禁止返回StudyInstanceUID。一般默认配置无需调整,此步骤仅作为排查项。
内容的提问来源于stack exchange,提问作者Jeremias Caballero Celan
相关产品推荐
相关产品推荐

