如何在使用Python脚本将文件从.xls转为.csv时避免数字以指数形式出现?
我正在尝试用一个Python脚本把Excel里的数据插入到一个Postgres数据库的表里。不过我遇到了一个问题,就是一些比较大的数字被插入后显示成了科学计数法。后来我发现,这个问题是在把文件从.xls格式转换成.csv格式时出现的(我从来不打开.xls文件,因为我知道Excel会做一些奇怪的事情,把较大的数字保存成科学计数法)。
有没有简单的方法可以确保这些数字不显示成科学计数法呢?
比如说,812492400097被显示成了8.12E+11。
这是我用来转换成.csv格式的脚本:
import xlrd
import unicodecsv
import sys
import os
import datetime
def csv_from_excel(xlsfile, csvfile):
wb = xlrd.open_workbook(xlsfile)
sh = wb.sheet_by_index(0)
outputfile = open(csvfile, 'wb')
wr = unicodecsv.writer(outputfile, quoting=unicodecsv.QUOTE_ALL)
for rownum in xrange(sh.nrows):
wr.writerow(sh.row_values(rownum))
outputfile.close()
def log(s):
print str(datetime.datetime.now()) + ": " + s
#main
if len(sys.argv) < 2:
print "Missing parameters: input xls file"
sys.exit()
sourcefile = sys.argv[1]
destfile = sourcefile.split('.')[0] + '.csv'
log("processing " + sourcefile)
csv_from_excel(sourcefile, destfile)
我还在想,是否可以在插入到Postgres表时,把科学计数法的数字转换成普通数字,而不是确保.csv文件里的数字不变成科学计数法?
1 个回答
0
xlrd
这个模块把Excel里的所有数字都当作浮点数来处理,因为Excel计算所有数字的时候都是用浮点数的方式:
https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966#sheet.Cell-class
- 类型符号 [类型编号] Python值
- XL_CELL_EMPTY [0] 空字符串 u''
- XL_CELL_TEXT [1] 一个Unicode字符串
- XL_CELL_NUMBER [2] 浮点数
- XL_CELL_DATE [3] 浮点数
- XL_CELL_BOOLEAN [4] 整数;1表示真(TRUE),0表示假(FALSE)
- XL_CELL_ERROR [5] 整数,表示Excel内部的错误代码;想要文本表示,可以参考提供的字典 error_text_from_code
- XL_CELL_BLANK [6] 空字符串 u''。注意:这个类型只有在使用 open_workbook(..., formatting_info=True) 时才会出现。
你的解决方案可能需要定义 unicodecsv
用来写浮点数的格式。
之前有个问题(我怎么能防止 csv.DictWriter() 或 writerow() 把我的浮点数四舍五入?)提到过,csv
模块以前是用 float.__str__
而不是 float.__repr__
,这导致了四舍五入的问题。unicodecsv
可能还是在使用 float.__str__
。