2012-03-13 48 views
1

我遇到了一个问题,在我的csv写入过程中浮点数被截断。这很难复制,因为它在数千个文件中很少发生,但我需要防范。这是什么样的代码看起来像一个例子:在python中写入浮动到csvs - 截断错误

import csv 
import numpy as np 
x = np.random.normal(0, .001, 1000).tolist() 
draws_header = ['draw%s'%(x) for x in range(1000)] 
final_output = np.array(x) 
outfile = open('filepath.csv', 'w') 
writer = csv.writer('filepath') 
writer.writerow(first_row) 
writer.writerows(final_output) 
outfile.close() 

基于输出(其中所有数字都必然低于1),它看起来像一个小数目(即,”最终的字符... e-5“)正在迷路:

draw373   draw374   draw375   draw376  
0.000744  0.003008  0.001566   9.727522 

有关如何防止这种情况的任何建议?

回答

2

我会建议使用numpy的csv作家。例如:

>>> import numpy as np 
>>> x = np.random.normal(0, .001, 1000) 
>>> draws_header = ['draw%s'%(i) for i in range(1000)] 
>>> f = open('file.csv', 'w') 
>>> np.savetxt(f, np.array(draws_header)[:,None].T, fmt="%s", delimiter="\t") 
>>> np.savetxt(f, x[:,None].T, delimiter="\t") 
>>> f.close() 

这会正确地序列化数字。您还可以将格式字符串传递给savetxt以指定如何打印浮点值。

+0

感谢您的提示 - 我会给它一个旋转。 – mike 2012-03-13 22:29:38

+0

好的答案,但它会更清洁这种方式: >>> np.savetxt(f,np.array([draws_header]),fmt =“%s”,delimiter =“\ t”) >>> np .savetxt(f,[x],delimiter =“\ t”) – Tickon 2014-03-27 17:16:38

1

问题是在数字的十进制表示和内存表示之间进行转换。

你能得到关于Python实现浮动的更多细节: http://docs.python.org/library/sys.html#sys.float_info

还有约浮点全面的教程: http://docs.python.org/tutorial/floatingpoint.html

尤其我建议你参考“表示错误”

#input 
a = 0 
for x in xrange(10): 
    a += 0.1 
print a 
#output 
0.9999999999999999 

如果您的应用需要高精度,您可以使用:

#input 
from decimal import Decimal 
a = Decimal('0.0') 
for x in xrange(10): 
    a += Decimal('0.1') 
print a 
#output 
1.0