pds4_tools.utils.helpers module

Functions

cast_int_float_string(value)

Cast given string value, if possible, to an int, float or returns unchanged.

is_array_like(value)

Array-like values are defined as those that implement __len__ (such as list, tuple, array.array, np.ndarray, etc) but are not str, unicode or bytes.

finite_min_max(array_like)

Obtain finite (non-NaN, non-Inf) minimum and maximum of an array.

dict_extract(nested_dict, key)

Recursively searches nested dictionaries.

xml_to_dict(xml_element[, skip_attributes, ...])

Transforms XML to an OrderedDict.

Details

cast_int_float_string(value)[source]

Cast given string value, if possible, to an int, float or returns unchanged.

Parameters
valuestr or unicode

Value to try casting to an int and float.

Returns
int, float, str or unicode

Cast value.

is_array_like(value)[source]

Array-like values are defined as those that implement __len__ (such as list, tuple, array.array, np.ndarray, etc) but are not str, unicode or bytes.

Parameters
value

Any kind of value.

Returns
bool

True if value is array-like, false otherwise.

finite_min_max(array_like)[source]

Obtain finite (non-NaN, non-Inf) minimum and maximum of an array.

Parameters
array_likearray_like

A numeric array of some kind, possibly containing NaN or Inf values.

Returns
tuple

Two-valued tuple containing the finite minimum and maximum of array_like.

dict_extract(nested_dict, key)[source]

Recursively searches nested dictionaries.

nested_dict may contain other dictionaries, or other array-like’s that have dictionaries inside: all dictionaries anywhere will be searched.

Adapted from http://stackoverflow.com/a/29652561.

Parameters
nested_dictdict or OrderedDict

A dictionary potentially containing an arbitrary number of other dictionaries.

keystr or unicode

The key to search for in nested_dict.

Returns
generator

Found values for key in any dictionary inside nested_dict.

Notes

This code is generally efficient. However, if you pass it a dictionary that has a huge array nested within it, it will not be performant because it will try to search each value in the array for a dictionary (this is by design; the intent if non-dict array-like’s are present is to search them on the assumption they will be small where using this function makes sense).

Examples

>>> d = { "id" : "abcde",
          "key1" : "blah",
          "key2" : "blah blah",
          "nestedlist" : [
            "blah blah",
            { "id" : "qwerty",
            "key1": "blah"} ]
        }
>>> result = dict_extract(d, 'id')
>>> print(list(result))
['abcde', 'qwerty']
xml_to_dict(xml_element, skip_attributes=False, cast_values=False, cast_ignore=(), tag_modify=())[source]

Transforms XML to an OrderedDict.

Takes an XML ElementTree Element or a Label and creates an equivalent OrderedDict. Keys of the dictionary represent tag names and values represent the text values of the elements. In case of a (sub)element having child elements, values will be another OrderedDict, inside which the text of the element has key ‘_text’. In case of (sub)elements having child elements with the same key, the value for the key will be a list. In case of (sub)elements with attributes, the value will be an OrderedDict, inside which the key for each attribute starts with ‘@’ and the text of the element has key ‘_text’. For text elements, the text value is not preserved (and a ‘_text’ key is not created) if it contains only whitespace (including spaces, tabs and newlines); otherwise whitespaces are preserved.

Preserves order of elements in most cases. The exception is when an element has 2 or more sets of children, where each set has the same key names (i.e., there are at least 4 children, and 2 of those children have one key, and 2 have another key) and the order of the children with the non-matching keys is intertwined, in such a case the order of the intertwined keys will not be preserved.

Adapted from http://stackoverflow.com/a/10076823.

Parameters
xml_elementElementTree Element or Label

XML representation which will be turned into a dictionary.

skip_attributesbool, optional

If True, skips adding attributes from XML. Defaults to False.

cast_valuesbool, optional

If True, float and int compatible values of element text and attribute values will be cast as such in the output dictionary. Defaults to False.

cast_ignoretuple[str or unicode], optional

If given, then a tuple of element tags and/or attribute names. If cast_values is True, then for elements and attributes matching exactly the values in this tuple, values will not be cast. Attribute names must be prepended by an ‘@’. If tag_modify is set, then tags and attribute names specified by cast_ignore should be the already tag modified versions. Empty by default.

tag_modifytuple, optional

If given, then a 2-valued tuple with str or unicode values, or a tuple of 2-valued tuples. Any match, including partial, in element tag names and/or attributes names for each tag_modify[0] is replaced with tag_modify[1]. Empty by default.

Returns
OrderedDict

Dictionary representation of the XML input.