I have a dictionary that I want to write to a csv file, but the floats in the dictionary are rounded off when I write them to the file. I want to keep the maximum precision.
Where does the rounding occur and how can I prevent it?
What I did
I followed the DictWriter example here and I’m running Python 2.6.1 on Mac (10.6 – Snow Leopard).
# my import statements
import sys
import csv
Here is what my dictionary (d) contains:
>>> d = runtime.__dict__
>>> d
{'time_final': 1323494016.8556759,
'time_init': 1323493818.0042379,
'time_lapsed': 198.85143804550171}
The values are indeed floats:
>>> type(runtime.time_init)
<type 'float'>
Then I setup my writer and write the header and values:
f = open(log_filename,'w')
fieldnames = ('time_init', 'time_final', 'time_lapsed')
myWriter = csv.DictWriter(f, fieldnames=fieldnames)
headers = dict( (n,n) for n in fieldnames )
myWriter.writerow(headers)
myWriter.writerow(d)
f.close()
But when I look in the output file, I get rounded numbers (i.e., floats):
time_init,time_final,time_lapsed
1323493818.0,1323494016.86,198.851438046
< EOF >
It looks like csv is using float.__str__ rather than float.__repr__:
Looking at the csv source, this appears to be a hardwired behavior. A workaround is to cast all of the float values to their repr before csv gets to it. Use something like:
d = dict((k, repr(v)) for k, v in d.items()).Here’s a worked-out example:
This code produces the following output:
A more refined approach will take care to only make replacements for floats:
Note, I’ve just fixed this issue for Py2.7.3, so it shouldn’t be a problem in the future. See http://hg.python.org/cpython/rev/bf7329190ca6