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 used, 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,
                        pydicom::rtplan.dcm::BeamSequence[0],
                        yourplan.dcm::BeamSequence[0].BeamNumber
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.