在python中写入浮动到csvs - 截断错误

时间:2012-03-13 21:49:57

标签: python csv floating-point truncate

我遇到了一个问题,在我的csv写入过程中浮点数被截断了。这很难复制,因为它很少发生在数千个文件中,但我需要对它进行保护。以下是代码的示例:

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),看起来像一个小数字的最终字符(即&#34; ... e-5&#34;)会迷路:< / p>

draw373         draw374         draw375          draw376    
0.000744        0.003008        0.001566         9.727522

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

2 个答案:

答案 0 :(得分: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以指定如何打印浮点值。

答案 1 :(得分:1)

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

您可以获得有关float的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