Usage¶
The basic API is available for working with conventional namelist files and performing simple operations, such as reading or modifying values.
Users who require more control over parsing and namelist output formatting should create objects which can be controlled using the properties described below.
Basic API¶
- f90nml.read(nml_path)¶
Parse a Fortran namelist file and return its contents.
File object usage:
>>> with open(nml_path) as nml_file: >>> nml = f90nml.read(nml_file)
File path usage:
>>> nml = f90nml.read(nml_path)
This function is equivalent to the
read
function of theParser
object.>>> parser = f90nml.Parser() >>> nml = parser.read(nml_file)
- f90nml.write(nml, nml_path, force=False, sort=False)¶
Save a namelist to disk using either a file object or its file path.
File object usage:
>>> with open(nml_path, 'w') as nml_file: >>> f90nml.write(nml, nml_file)
File path usage:
>>> f90nml.write(nml, 'data.nml')
This function is equivalent to the
write
function of theNamelist
objectnml
.>>> nml.write('data.nml')
By default,
write
will not overwrite an existing file. To override this, use theforce
flag.>>> nml.write('data.nml', force=True)
To alphabetically sort the
Namelist
keys, use thesort
flag.>>> nml.write('data.nml', sort=True)
- f90nml.patch(nml_path, nml_patch, out_path=None)¶
Create a new namelist based on an input namelist and reference dict.
>>> f90nml.patch('data.nml', nml_patch, 'patched_data.nml')
This function is equivalent to the
read
function of theParser
object with the patch output arguments.>>> parser = f90nml.Parser() >>> nml = parser.read('data.nml', nml_patch, 'patched_data.nml')
A patched namelist file will retain any formatting or comments from the original namelist file. Any modified values will be formatted based on the settings of the
Namelist
object.
Classes¶
- class f90nml.parser.Parser¶
Fortran namelist parser.
- read(nml_fname, nml_patch_in=None, patch_fname=None)¶
Parse a Fortran namelist file and store the contents.
>>> parser = f90nml.Parser() >>> data_nml = parser.read('data.nml')
- reads(nml_string)¶
Parse a namelist string and return an equivalent Namelist object.
>>> parser = f90nml.Parser() >>> data_nml = parser.reads('&data_nml x=1 y=2 /')
- property comment_tokens¶
Return a string of single-character comment tokens in the namelist.
- Type:
str
- Default:
'!'
Some Fortran programs will introduce alternative comment tokens (e.g.
#
) for internal preprocessing.If you need to support these tokens, create a
Parser
object and set the comment token as follows:>>> parser = f90nml.Parser() >>> parser.comment_tokens += '#' >>> nml = parser.read('sample.nml')
Be aware that this is non-standard Fortran and could mangle any strings using the
#
characters. Characters inside string delimiters should be protected, however.
- property default_start_index¶
Assumed starting index for a vector.
- Type:
int
- Default:
1
Since Fortran allows users to set an arbitrary start index, it is not always possible to assign an index to values when no index range has been provided.
For example, in the namelist
idx.nml
shown below, the index of the values in the second assignment are ambiguous and depend on the implicit starting index.&idx_nml v(3:5) = 3, 4, 5 v = 1, 2 /
The indices of the second entry in
v
are ambiguous. The result for different values ofdefault_start_index
are shown below.>>> parser = f90nml.Parser() >>> parser.default_start_index = 1 >>> nml = parser.read('idx.nml') >>> nml['idx_nml']['v'] [1, 2, 3, 4, 5]
>>> parser.default_start_index = 0 >>> nml = parser.read('idx.nml') >>> nml['idx_nml']['v'] [1, 2, None, 3, 4, 5]
- property global_start_index¶
Define an explicit start index for all vectors.
- Type:
int
,None
- Default:
None
When set to
None
, vectors are assumed to start at the lowest specified index. If no index appears in the namelist, thendefault_start_index
is used.When
global_start_index
is set, then all vectors will be created using this starting index.For the namelist file
idx.nml
shown below,&idx_nml v(3:5) = 3, 4, 5 /
the following Python code behaves as shown below.
>>> parser = f90nml.Parser() >>> nml = parser.read('idx.nml') >>> nml['idx_nml']['v'] [3, 4, 5]
>>> parser.global_start_index = 1 >>> nml = parser.read('idx.nml') >>> nml['idx_nml']['v'] [None, None, 3, 4, 5]
Currently, this property expects a scalar, and applies this value to all dimensions.
- property row_major¶
Read multidimensional arrays in row-major format.
- Type:
bool
- Default:
False
Multidimensional array data contiguity is preserved by default, so that column-major Fortran data is represented as row-major Python list of lists.
The
row_major
flag will reorder the data to preserve the index rules between Fortran to Python, but the data will be converted to row-major form (with respect to Fortran).
- property sparse_arrays¶
Store unset rows of multidimensional arrays as empty lists.
- Type:
bool
- Default:
False
Enabling this flag will replace rows of unset values with empty lists, and will also not pad any existing rows when other rows are expanded.
This is not a true sparse representation, but rather is slightly more sparse than the default dense array representation.
- property strict_logical¶
Use strict rules for parsing logical data value parsing.
- Type:
bool
- Default:
True
The
strict_logical
flag will limit the parsing of non-delimited logical strings as logical values. The default value isTrue
.When
strict_logical
is enabled, only.true.
,.t.
,true
, andt
are interpreted asTrue
, and only.false.
,.f.
,false
, andf
are interpreted as false.When
strict_logical
is disabled, any value starting with.t
ort
is interpreted asTrue
, while any string starting with.f
orf
is interpreted asFalse
, as described in the language standard. However, it can interfere with namelists which contain non-delimited strings.
- class f90nml.namelist.Namelist(default_start_index=None[, items])¶
Representation of Fortran namelist in a Python environment.
Namelists can be initialised as empty or with a pre-defined dict of items. If an explicit default start index is required for items, then it can be initialised with the default_start_index input argument.
In addition to the standard methods supported by dict, several additional methods and properties are provided for working with Fortran namelists.
- class RepeatValue(n, value)¶
Container class for output using repeat counters.
- add_cogroup(key, val)¶
Append a duplicate group to the Namelist as a new group.
- create_cogroup(group_name)¶
Convert an existing namelist group to a cogroup.
- get(key, default=None)¶
Return the value for key if key is in the Namelist, else default.
- groups()¶
Return an iterator that spans values with group and variable names.
Elements of the iterator consist of a tuple containing two values. The first is internal tuple containing the current namelist group and its variable name. The second element of the returned tuple is the value associated with the current group and variable.
- items()¶
Return the namelist keys as an ItemsView.
- keys()¶
Return the namelist keys as a KeysView.
- patch(nml_patch)¶
Update the namelist from another partial or full namelist.
This is different from the intrinsic update() method, which replaces a namelist section. Rather, it updates the values within a section.
- todict(complex_tuple=False)¶
Return a dict equivalent to the namelist.
Since Fortran variables and names cannot start with the
_
character, any keys starting with this token denote metadata, such as starting index.The
complex_tuple
flag is used to convert complex data into an equivalent 2-tuple, with metadata stored to flag the variable as complex. This is primarily used to facilitate the storage of the namelist into an equivalent format which does not support complex numbers, such as JSON or YAML.
- write(nml_path, force=False, sort=False)¶
Write Namelist to a Fortran 90 namelist file.
>>> nml = f90nml.read('input.nml') >>> nml.write('out.nml')
- property column_width¶
Set the maximum number of characters per line of the namelist file.
- Type:
int
- Default:
72
Tokens longer than
column_width
are allowed to extend past this limit.
- property default_start_index¶
Set the default start index for vectors with no explicit index.
- Type:
int
,None
- Default:
None
When the default_start_index is set, all vectors without an explicit start index are assumed to begin with default_start_index. This index is shown when printing the namelist output.
If set to None, then no start index is assumed and is left as implicit for any vectors undefined in start_index.
- property end_comma¶
Append commas to the end of namelist variable entries.
- Type:
bool
- Default:
False
Fortran will generally disregard any commas separating variable assignments, and the default behaviour is to omit these commas from the output. Enabling this flag will append commas at the end of the line for each variable assignment.
- property false_repr¶
Set the string representation of logical false values.
- Type:
str
- Default:
'.false.'
This is equivalent to the first element of
logical_repr
.
- property float_format¶
Set the namelist floating point format.
- Type:
str
- Default:
''
The property sets the format string for floating point numbers, following the format expected by the Python
format()
function.
- property indent¶
Set the whitespace indentation of namelist entries.
- Type:
int
,str
- Default:
' '
(four spaces)
This can be set to an integer, denoting the number of spaces, or to an explicit whitespace character, such as a tab (
\t
).
- property index_spacing¶
Apply a space between indexes of multidimensional vectors.
- Type:
bool
- Default:
False
- property logical_repr¶
Set the string representation of logical values.
- Type:
dict
- Default:
{False: '.false.', True: '.true.'}
There are multiple valid representations of True and False values in Fortran. This property sets the preferred representation in the namelist output.
The properties
true_repr
andfalse_repr
are also provided as interfaces to the elements oflogical_repr
.
- property repeat_counter¶
Return whether the namelist uses repeat counters for arrays.
If True, then arrays with repeated values will use repeat tokens. For example, the array
[1, 2, 2, 2]
will be written as1, 3*2
.- Type:
bool
- Default:
False
- property split_strings¶
Split strings at the
column_width
over multiple lines.- Type:
bool
- Default:
False
- property start_index¶
Set the starting index for each vector in the namelist.
- Type:
dict
- Default:
{}
start_index
is stored as a dict which contains the starting index for each vector saved in the namelist. For the namelistvec.nml
shown below,&vec_nml a = 1, 2, 3 b(0:2) = 0, 1, 2 c(3:5) = 3, 4, 5 d(:,:) = 1, 2, 3, 4 /
the
start_index
contents are>>> import f90nml >>> nml = f90nml.read('vec.nml') >>> nml['vec_nml'].start_index {'b': [0], 'c': [3], 'd': [None, None]}
The starting index of
a
is absent fromstart_index
, since its starting index is unknown and its values cannot be assigned without referring to the corresponding Fortran source.
- property true_repr¶
Set the string representation of logical true values.
- Type:
str
- Default:
.true.
This is equivalent to the second element of
logical_repr
.
- property uppercase¶
Print group and variable names in uppercase.
- Type:
bool
- Default:
False
This is equivalent to the second element of
logical_repr
.