如何修复pydicom的dcmread前同步码错误?

问题描述

我在给定路径上确实存在的DICOM文件上遇到dcmread()问题。我不确定出了什么问题。这是我的代码

import pydicom

f = "/exact/path/hi.dcm"
fn = get_testdata_file(f)
ds = pydicom.dcmread(fn)

ds.soPClassUID = ds.MediaStorageSOPClassUID

我遇到以下错误

Traceback (most recent call last):
  File "addfields.py",line 14,in <module>
    ds = pydicom.dcmread(fn)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/pydicom/filereader.py",line 871,in dcmread
    force=force,specific_tags=specific_tags)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/pydicom/filereader.py",line 668,in read_partial
    preamble = read_preamble(fileobj,force)
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/pydicom/filereader.py",line 605,in read_preamble
    preamble = fp.read(128)
AttributeError: 'nonetype' object has no attribute 'read'

但是我不确定为什么,因为“ hi.dcm”是一个存在的文件(路径正确)并且内部包含元数据。我不知道什么是序言,以及它是否出现在我正在处理的图像中。

解决方法

免责声明:我是pydicom的撰稿人。

发生错误是因为get_testdata_file返回None,然后将其用作文件名。错误消息本身有点误导-在这种情况下,提高FileNotFoundValueError可能会更好。相反,发生的事情是,首先读取的是前同步码(DICOM图像的标记,该标记由128个零字节组成,后跟'DICM'),并且在尝试读取该标记时,由于文件指针为{{ 1}}。

这是documentation for get_testdata_file

返回具有文件名的第一个匹配数据集的绝对路径。

首先搜索本地pydicom数据存储,然后搜索任何本地可用的外部源,最后搜索pydicom / pydicom-data存储库中可用的文件。

因此这是一个便捷功能,主要用于查找pydicom测试数据文件。
如果您已经有了文件路径,则可以使用它:

None

对于前同步码,如果DICOM文件没有前同步码(旧的ACR-NEMA格式),则可以使用import pydicom fn = "/exact/path/hi.dcm" ds = pydicom.dcmread(fn) 参数读取此类文件:

force=True

尽管只有在您确实有这样的文件时才使用它,因为它还会尝试将非DICOM文件作为DICOM处理,这可能会导致一些意外的异常。如前所述,这种情况下的错误与丢失的前导码无关,而是与错误的文件路径有关。

更新:
在当前主版本以及ds = pydicom.dcmread(fn,force=True) 的未来2.1版本中,此行为已更改。如果通过pydicomdcmread现在将通过有意义的消息引发TypeError

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...