其他分享
首页 > 其他分享> > 我如何防止csv.DictWriter()或writerow()舍入我的浮点数?

我如何防止csv.DictWriter()或writerow()舍入我的浮点数?

作者:互联网

我有一个要写入csv文件的字典,但是当我将其写入文件时,字典中的浮点数会四舍五入.我想保持最高的精度.

舍入在哪里发生,如何防止?

我做了什么

我遵循了DictWriter example here,并且在Mac(10.6-Snow Leopard)上运行Python 2.6.1.

# my import statements
import sys
import csv

这是我的字典(d)包含的内容:

>>> d = runtime.__dict__
>>> d
{'time_final': 1323494016.8556759,
'time_init': 1323493818.0042379,
'time_lapsed': 198.85143804550171}

这些值的确是浮点数:

>>> type(runtime.time_init)
<type 'float'>

然后,设置我的编写器并编写标题和值:

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()

但是当我查看输出文件时,会得到四舍五入的数字(即浮点数):

time_init,time_final,time_lapsed
1323493818.0,1323494016.86,198.851438046

&LT EOF>

解决方法:

看起来csv正在使用float .__ str__而不是float .__ repr__:

>>> print repr(1323494016.855676)
1323494016.855676
>>> print str(1323494016.855676)
1323494016.86

查看csv source,这似乎是一种硬连接行为.一种解决方法是在csv到达之前将所有float值转换为它们的repr.使用类似的东西:d = dict((k,repr(v))对于d.items()中的k,v.

这是一个解决的示例:

import sys, csv

d = {'time_final': 1323494016.8556759,
     'time_init': 1323493818.0042379,
     'time_lapsed': 198.85143804550171
}

d = dict((k, repr(v)) for k, v in d.items())

fieldnames = ('time_init', 'time_final', 'time_lapsed')
myWriter = csv.DictWriter(sys.stdout, fieldnames=fieldnames)
headers = dict( (n,n) for n in fieldnames )
myWriter.writerow(headers)
myWriter.writerow(d)

此代码产生以下输出:

time_init,time_final,time_lapsed
1323493818.0042379,1323494016.8556759,198.85143804550171

一种更精细的方法将注意只替换浮点数:

d = dict((k, (repr(v) if isinstance(v, float) else str(v))) for k, v in d.items())

请注意,我已经解决了Py2.7.3的问题,因此将来不再是问题.参见http://hg.python.org/cpython/rev/bf7329190ca6

标签:python,floating-point,csv,rounding,file-io
来源: https://codeday.me/bug/20191010/1887011.html