pydicom codify
command#
The pydicom codify
command takes a DICOM file and produces Python code to
recreate that file, or, optionally a subset within that file.
See Using codify for full details of writing a complete file. Here we will review the command-line options in more detail than in that section, and show how to export a dataset within a DICOM file that has sequences.
Warning
The code produced by codify
will contain all the information in the original
file, which may include private health information or other sensitive
information.
A simple example#
A simple example of using the codify
command would be:
$ pydicom codify pydicom::rtplan.dcm
# Coded version of DICOM file 'C:\git\pydicom\pydicom\data\test_files\rtplan.dcm'
# Produced by pydicom codify utility script
import pydicom
from pydicom.dataset import Dataset, FileMetaDataset
from pydicom.sequence import Sequence
# Main data elements
ds = Dataset()
ds.InstanceCreationDate = '20030903'
ds.InstanceCreationTime = '150031'
ds.SOPClassUID = '1.2.840.10008.5.1.4.1.1.481.5'
ds.SOPInstanceUID = '1.2.777.777.77.7.7777.7777.20030903150023'
ds.StudyDate = '20030716'
ds.StudyTime = '153557'
.
.
.
Note that prefixing the file specification with pydicom::
will read the file
from the pydicom test data files rather than from the file system.
Command options#
In the above example, the output was directed to screen, because no output file
was specified. To see the available command options, use the help
command:
pydicom help codify
usage: pydicom codify [-h] [-e EXCLUDE_SIZE] [-p] [-s SAVE_AS] filespec [outfile]
Read a DICOM file and produce the *pydicom* (Python) code which can create that file
positional arguments:
filespec File specification, in format [pydicom::]filename[::element]. If `pydicom::` prefix is present,
then use the pydicom test file with that name. If `element` is given, use only that data element
within the file. Examples: path/to/your_file.dcm, your_file.dcm::StudyDate,
your_file.dcm::(0001,0001), pydicom::rtplan.dcm::BeamSequence[0],
yourplan.dcm::BeamSequence[0].BeamNumber, pydicom::rtplan.dcm::(300A,00B0)[0].(300A,00B6)
outfile Filename to write python code to. If not specified, code is written to
stdout
optional arguments:
-h, --help show this help message and exit
-e EXCLUDE_SIZE, --exclude-size EXCLUDE_SIZE
Exclude binary data larger than specified (bytes). Default is 100 bytes
-p, --include-private
Include private data elements (default is to exclude them)
-s SAVE_AS, --save-as SAVE_AS
Specify the filename for ds.save_as(save_filename); otherwise the input name
+ '_from_codify' will be used
Binary data (e.g. pixels) larger than --exclude-size (default 100 bytes) is not included. A dummy
line with a syntax error is produced. Private data elements are not included by default.
For example:
pydicom codify -s savename.dcm dicomfile.dcm pythoncode.py
would read the DICOM file “dicomfile.dcm” and write the Python code
to file “pythoncode.py”. In that code, near the end of the file
would be a ds.save_as("savename.dcm", ...)
line.
Note
By default, any private data elements within the file are not translated
to code. If you want to include them, use the -p
parameter.
Codifying a part of a DICOM file#
Note that the filespec
argument to the codify
command, as for
the show command, allows you to specify a data element within the file,
rather than the whole file:
pydicom codify pydicom::rtplan.dcm::FractionGroupSequence[0]
# Coded version of non-file dataset
...
# Main data elements
ds = Dataset()
ds.FractionGroupNumber = "1"
ds.NumberOfFractionsPlanned = "30"
ds.NumberOfBeams = "1"
ds.NumberOfBrachyApplicationSetups = "0"
# Referenced Beam Sequence
refd_beam_sequence = Sequence()
ds.ReferencedBeamSequence = refd_beam_sequence
# Referenced Beam Sequence: Referenced Beam 1
refd_beam1 = Dataset()
refd_beam1.BeamDoseSpecificationPoint = [239.531250000000, 239.531250000000, -751.87000000000]
...
Currently, only a data element which is a Dataset
(an item within a Sequence
) is accepted.
The resulting code would not on its own produce a correct DICOM file,
but could be useful as a model when creating
more complete code. For example, issuing code for one item in a
Sequence
could be the starting point towards a loop
producing a number of sequence items.