在python中将浮点写入CSV——截断错误
我遇到了一个问题,在我写csv的过程中,浮点数被截断了。这是很难复制的,因为它很少发生在数千个文件中,但我需要对它进行保护。下面是代码的示例:在python中将浮点写入CSV——截断错误,python,csv,floating-point,truncate,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.
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
关于如何防止这种情况,有什么建议吗?我建议使用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,以指定如何打印浮点值。问题在于数字的十进制表示法和内存表示法之间的转换 您可以获得有关float的python实现的更多详细信息: 还有关于浮点的全面教程: 特别是我建议您选择“表示错误”一节 如果您的应用程序需要高精度,您可以使用:
#input
from decimal import Decimal
a = Decimal('0.0')
for x in xrange(10):
a += Decimal('0.1')
print a
#output
1.0
谢谢你的提示--我会给它一个旋转。很好的回答,但是这样会更干净:>>>np.savetxt(f,np.array([draws_header]),fmt=“%s”,delimiter=“\t”)>>>np.savetxt(f,[x],delimiter=“\t”)
#input
from decimal import Decimal
a = Decimal('0.0')
for x in xrange(10):
a += Decimal('0.1')
print a
#output
1.0