使用pydicom打开DCM文件报错No tag to read,求解决方案
问题:使用pydicom读取DCM文件时报错"No tag to read at file position 3AC03D2"
报错信息
No tag to read at file position 3AC03D2
调用代码
base = r"D:\fff" pass_dicom = "dd.dcm" # enter DICOM image name for pattern # result is a list of 1 element filename = pydicom.data.data_manager.get_files(base, pass_dicom) ds = pydicom.dcmread(filename)
报错触发代码段
报错发生在read_sequence_item函数中,当bytes_read = b''时抛出异常:
def read_sequence_item( fp: BinaryIO, is_implicit_VR: bool, is_little_endian: bool, encoding: Union[str, MutableSequence[str]], offset: int = 0 ) -> Optional[Dataset]: """Read and return a single :class:`~pydicom.sequence.Sequence` item, i.e. a :class:`~pydicom.dataset.Dataset`. """ seq_item_tell = fp.tell() + offset if is_little_endian: tag_length_format = "<HHL" else: tag_length_format = ">HHL" try: bytes_read = fp.read(8) group, element, length = unpack(tag_length_format, bytes_read) except BaseException: raise IOError( f"No tag to read at file position {fp.tell() + offset:X}" )
解决方案
- 修正文件路径传递问题:
pydicom.data.data_manager.get_files返回的是文件路径列表,直接传给dcmread会导致参数错误,应该取列表中的第一个元素:filename = pydicom.data.data_manager.get_files(base, pass_dicom)[0] - 检查DCM文件完整性:文件可能因传输中断、存储损坏导致数据缺失,用专业DICOM查看器(如RadiAnt)打开文件,确认是否能正常显示。
- 强制读取跳过错误:调用
dcmread时添加force=True参数,强制读取非标准或损坏的DICOM文件:
也可以尝试ds = pydicom.dcmread(filename, force=True)stop_before_pixels=True先读取元数据,排查是否是像素数据部分的问题:ds = pydicom.dcmread(filename, stop_before_pixels=True) - 验证DICOM合规性:使用
pydicom的验证工具检查文件元数据是否符合标准:
或者用DCMTK工具集的from pydicom import validate_file_meta validate_file_meta(ds.file_meta)dcmdump命令分析文件结构,定位异常标签。 - 手动定位错误位置:用十六进制编辑器打开文件,跳转到偏移量
0x3AC03D2的位置,检查该位置是否存在有效的DICOM标签(标准标签为4字节组号+4字节元素号,后续为长度字段),如果是无效数据,可尝试手动修复或忽略该序列部分。
内容的提问来源于stack exchange,提问作者easyfreeze
相关产品推荐
相关产品推荐

