最近用刚学的python做了一个对excel数据进行分类汇总,然后把数据导入数据库的小程序。运用python中pandas库来处理excel。pandas是一个开源,易于使用的数据结构和数据分析工具。

 主要有两种数据类型

   序列(Series):一维标记数组,能够保存任何数据类型,有索引。


python 将pg数据库 表tb1 分批次导出到 excel中 python把excel数据导入数据库_python

     

python 将pg数据库 表tb1 分批次导出到 excel中 python把excel数据导入数据库_excel_02

数据帧(dataframe):二维标记数据结构,可以传递行索引和列索引

     

python 将pg数据库 表tb1 分批次导出到 excel中 python把excel数据导入数据库_数据库_03

     

python 将pg数据库 表tb1 分批次导出到 excel中 python把excel数据导入数据库_sqlserver_04

    这个工具包运用起来也比较简单,几行代码就能写完数据的分类汇总之类的功能,当然也可以做更复杂的数据处理

     

python 将pg数据库 表tb1 分批次导出到 excel中 python把excel数据导入数据库_sqlserver_05

 (部分代码)

在这个小demo完成之后,在自己测试的正常,在实际运用的时候被一位小姐姐测试出了一个问题,后台提示error:ValueError: expected a simple type, a tuple or a list,对比两份导入的excel数据格式所导入的数据列都没有问题。然后将处理后输出的列表元组直接后台输出,写在测试类中发现输出的数据又能正常的insert进入数据库,经过一番折腾终于查出了问题的所在。

如图表一是我测试用的excel,表2是报错是所用的excel:

                                    表1

python 将pg数据库 表tb1 分批次导出到 excel中 python把excel数据导入数据库_数据库_06

                                    表2

python 将pg数据库 表tb1 分批次导出到 excel中 python把excel数据导入数据库_python_07

         两个excel单元属性,导入数据所在列完全相同,表1成功的用cur.executemany导入了数据库,表2提示error:ValueError: expected a simple type, a tuple or a list,将表2要导入的数据库的结果打印到后台

result=[(3, 9, 1, '2020-03-31', '2019年1-12月远程会诊补贴', '500105010302', 666, '1011', '金琪斐', '2020-03-31', 'GL00000000000010', 2020, 202003, 'GEAR576QM8923ZJTIKULYBX1VCHND0WS'),(3, 9, 6, '2020-03-31', '2019年1-12月远程会诊补贴', '500105010302', 10000.0, '104', '金琪斐', '2020-03-31', 'GL00000000000010', 2020, 202003, 'GEAR576QM8923ZJTIKULYBX1VCHND0WS')]    (数据量很大只截取部分)

看上去是一个很正常的由元组组成的list类型数据,然后直接把这个结果放到数据库导入测试类中执行cur.executemany(sql,result),数据也能正常insert进入数据库,但为什么软件中就会直接报错?

把pandas数据将元组中每一个元素的数据类型遍历输出,发现在金额数据表1是显示numpy.float64, 表2金额显示的竟然是numpy.int64,已经两张表金额列是相同的数据类型,保留小数位数也是一样的为什么会出先这种情况,经过不断地测试发现pandas,导入excel金额列如果,小数部分没有值,将全部以numpy.int64的数据类型导入,和excel中保留小数位数无关,当小数有值时数据才会以numpy.float64显示。所以执行pandas.read_excel先指定导入列的数据类型就可以解决这个问题(系统后台输出result是因为python已经将他作为float数据处理,所以测试类可以正常导入数据库)

python 将pg数据库 表tb1 分批次导出到 excel中 python把excel数据导入数据库_sqlserver_08