如何在使用Python脚本将文件从.xls转为.csv时避免数字以指数形式出现?

0 投票
1 回答
1336 浏览
提问于 2025-04-18 14:21

我正在尝试用一个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__

撰写回答