我想將excel(xlsx)文件中的數據轉儲到使用xlrd模塊的文本文件中,並遇到浮動進動的問題。Python Xlrd浮動進動問題
找到了一些類似問題的帖子,其中歲差丟失了16位十進制數字中的最後一位。
下面是XLSX複製的數據:
VALUE;DATA
1.01 HELLO
2.11 1/1/2014
3.21 ONE
4.31 1/1/2014 12:14
5.441 $10
6.241 TWO
77.11 Zulfi
8.11 99
9.11 99.999
10.11 0
下面是我從xlrd得到:
1.01|'HELLO'
2.1099999999999999|'2014-01-01 00:00:00.000000'
3.21|'ONE'
4.3099999999999996|'2014-01-01 12:14:00.000000'
5.4409999999999998|10.0
6.2409999999999997|'TWO'
77.109999999999999|'Zulfi'
8.1099999999999994|99.0
9.1099999999999994|99.998999999999995
10.109999999999999|0.0
- 「2.11」 已經成爲 「2.1099999999999999」 和 「4.31」 已經成爲「4.3099999999999996」等...
- 「$ 10」已成爲「10」
- 日期值看起來有點不同(此一個我瞭解和我得到了我的編碼)
我明白花車的一些奧祕那裏有鬆動歲差對於具有太多的數字發佈十進制值的可能性,但在這裏我只有兩個數字。
我通過與開源ETL工具「Pentaho」(用java編寫)進行比較來測試輸出,該工具可以讀取/寫入excel文件,並且該工具看起來沒有問題,因爲它們出現在xlsx文件中(田野裏讀爲字符串和數字,長度30和旋進20)
這裏是Pentaho的讀取
VALUE;DATA
1.01;HELLO
2.11;2014/01/01 00:00:00.000
3.21;ONE
4.31;2014/01/01 12:14:00.000
5.441; 10.0
6.241;TWO
77.11;Zulfi
8.11; 99.0
9.11; 99.999
10.11; 0.0
以下是我的Python代碼:
for rownum in xrange(sh.nrows):
for colnum in xrange(sh.ncols):
cell_obj = sh.cell(rownum,colnum)
cell_val=sh.cell_value(rownum,colnum)
if cell_obj.ctype == xlrd.XL_CELL_DATE:
year, month, day, hour, minute, second = xlrd.xldate_as_tuple(cell_val, wb.datemode)
py_date = datetime.datetime(year, month, day, hour, minute, second).strftime("%Y-%m-%d %H:%M:%S.%f")
cell_val = py_date
if (colnum==0):
row_values=repr(cell_val)
else :
row_values=row_values+fdel+repr(cell_val)
if (((row_values).find("\\n"))>-1):
NLFlag=1
file_output.write((row_values).replace('\\n','') + "\n")
row_values=''
file_output.close()
對此的任何幫助都非常感謝。
感謝
嘗試將您的Excel文件另存爲.xls。 python excel模塊是爲這種格式編寫的,所以這可能是一個促成因素。除此之外,你可能只需要處理電腦無法處理浮動的事實。 – wnnmaw
@wnnmaw:我會說電腦處理浮動很好。主要是遇到麻煩的人。 :-) –
[浮點限制]的可能重複(http://stackoverflow.com/questions/406361/floating-point-limitations) –