2012-03-13 26 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