Я использую python 3.6 в Windows для извлечения файла DICOM из базы данных в виде строки байтов. Теперь я хотел бы использовать библиотеку Pydicom
для чтения содержимого файла. Метод dcmread()
принимает файловый объект в качестве основного аргумента, однако следующий фрагмент кода вызывает ошибку при попытке доступа к сохраненным изображениям:
import sqlite3 as sql, io
...
dicom_as_bytes = cursor.fetchone()[0] # read bytes from sqlite3 request
dicom_as_bytes = io.BytesIO(dicom_as_bytes) # convert to file-like format
dcm_file = dcmread(dicom_as_bytes)
images = dcm_file.pixel_array # PermissionError: [Errno 13] Permission denied: 'C:\\Users\\<User>\\AppData\\Local\\Temp\\tmpfhvgc2oo'
С запросом sql сам по себе проблем нет, потому что я смог записать в постоянный файл и прочитать его:
tmp_file = open("tmp", "wb")
tmp_file.write(dicom_as_bytes)
tmp_file.close()
dcm_file = dcmread("tmp")
images = dcm_file.pixel_array # no error
Бесплатные анонимные файлы DICOM можно найти в Интернете с помощью небольшого поиска. Поскольку я не уверен, что имею право ссылаться на тот, который я использовал, я не буду размещать здесь ссылку - извините.
Вот pydicom
документация по методу dcmread
: ссылка< /а>
Вышеупомянутый метод работает. Однако я бы предпочел не создавать такой временный файл в папке проекта. Я также взглянул на библиотеку временных файлов Python, которая, похоже, не работает. у меня тоже по той или иной причине:
import tempfile
tmp_file = tempfile.NamedTemporaryFile()
temp_file.write(dicom_as_bytes)
temp_file.seek(0)
dcm_file = dcmread(temp_file)
images = dcm_file.pixel_array # TypeError: GDCM could not read DICOM image
temp_file.close()
В конце концов, я хотел бы знать, можно ли использовать BytesIO
или tempfile
для загрузки изображений файла DICOM из sqlite3
байтов данных, точно соответствующих sqlite3.Binary(open("file.dcm", "rb).read())
с "file.dcm"
файлом DICOM, хранящим более одного изображения. Я бы предпочел не использовать временный файл явно, потому что у меня не должно быть причин использовать временные файлы (нет нехватки памяти, места для хранения, я также не работаю над межпроцессным взаимодействием или аварийным восстановлением).
Мне интересно, есть ли необходимость как-то кодировать полученные байты перед созданием нового объекта BytesIO
или записью в TemporaryFile
. Однако это не так, потому что я могу просто записать их прямо в файл с open(filename, mode).write(dicom_bytes)
или TemporaryFile().write(dicom_bytes)
. Просто, с одной стороны, я могу получить доступ к массиву изображений, а с другой — нет (хотя я могу без проблем получить доступ к базовой информации, такой как dcm_file.filename
). Возможно, сработает преобразование объекта BytesIO
в объект FileIO
, хотя я понятия не имею, как это сделать, не создавая новый файл с open
.
PermissionError: [Errno 13] Permission denied...
) - person SpaceBurger   schedule 18.01.2021