我遇到了一个问题,在我的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
有关如何防止这种情况的任何建议吗?
答案 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