Casting to a "number" (both int and float)?
Victor Hooi
victorhooi at gmail.com
Fri Aug 28 00:57:34 EDT 2015
I'm reading JSON output from an input file, and extracting values.
Many of the fields are meant to be numerical, however, some fields are wrapped in a "floatApprox" dict, which messed with my parsing.
For example:
{
"hostname": "example.com",
"version": "3.0.5",
"pid": {
"floatApprox": 18403
}
"network": {
"bytesIn": 123123,
"bytesOut": {
"floatApprox": 213123123
}
}
The floatApprox wrapping appears to happen sporadically in the input.
I'd like to find a way to deal with this robustly.
For example, I have the following function:
def strip_floatApprox_wrapping(field):
# Extracts a integer value from a field. Workaround for the float_approx wrapping.
try:
return int(field)
except TypeError:
return int(field['floatApprox'])
which I can then call on each field I want to extract.
However, this relies on casting to int, which will only work for ints - for some fields, they may actually be floats, and I'd like to preserve that if possible.
(I know there's a isnumber() field - but you can only call that on a string - so if I do hit a floatApprox field, it will trigger a AttributeError exception, which seems a bit clunky to handle).
def strip_floatApprox_wrapping(field):
# Extracts a integer value from a field. Workaround for the float_approx wrapping.
try:
if field.isnumeric():
return field
except AttributeError:
return field['floatApprox']
Is there a way to re-write strip_floatApprox_wrapping to handle both ints/floats, and preserve the original format?
Or is there a more elegant way to deal with the arbitrary nesting with floatApprox?
More information about the Python-list
mailing list