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.