python读取excel数据时,整数和日期变小数的解决办法

参考:https://www.cnblogs.com/ivanpan/p/7300335.html

https://blog.csdn.net/java2013liu/article/details/80325704

https://www.cnblogs.com/zhoujie/p/python18.html

python读取Excel实例

1.操作步骤:


(1)安装python官方Excel库-->xlrd

(2)获取Excel文件位置并读取

(3)读取sheet

(4)读取指定rows和cols内容

2.示例代码

# -*- coding: utf-8 -*-

import xlrd

from datetime import date,datetime

def read_excel():

#文件位置

ExcelFile=xlrd.open_workbook(r'C:\Users\Administrator\Desktop\TestData.xlsx')

#获取目标EXCEL文件sheet名

print ExcelFile.sheet_names()

#------------------------------------

#若有多个sheet,则需要指定读取目标sheet例如读取sheet2

#sheet2_name=ExcelFile.sheet_names()[1]

#------------------------------------

#获取sheet内容【1.根据sheet索引2.根据sheet名称】

#sheet=ExcelFile.sheet_by_index(1)

sheet=ExcelFile.sheet_by_name('TestCase002')

#打印sheet的名称,行数,列数

print sheet.name,sheet.nrows,sheet.ncols

#获取整行或者整列的值

rows=sheet.row_values(2)#第三行内容

cols=sheet.col_values(1)#第二列内容

print cols,rows

#获取单元格内容

print sheet.cell(1,0).value.encode('utf-8')

print sheet.cell_value(1,0).encode('utf-8')

print sheet.row(1)[0].value.encode('utf-8')

#打印单元格内容格式

print sheet.cell(1,0).ctype

if__name__ =='__main__':

read_excel()

 

 

问题1:假如我们修改其中一个值为年份,读不出正确数字,而是数字

ctype介绍 :

0empty    1string     2number    3date    4boolean    5error

解决方法:先判断单元格内容再处理,具体如下:

 

>>> date_value = xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)
>>> date_value
(1992, 2, 22, 0, 0, 0)


想让excel数据返回一个字符串字典list,造了一个excel。数据如下:

 

用代码读取后发现整型和日期变成了小数(123456变成了123456.0,2017/5/20 5:20变成了42875.22222222222):

 

有个比较简单的解决办法就是在数字和日期的单元格内容前加上一个英文的逗号即可。如果数据比较多,也可以批量加英文逗号的前缀(网上都有方法)。

      

 

再次运行代码就正确了:

 

这种比较适合数据量较少的时候,如果数据量比较多,还是建议通过程序代码判断单元格内容的ctype来解决!

 

下面是我通过网上找的例子修改的代码。初学python没几天,有不足之处希望留言指正,大家共同学习!

注意:该例子没有对第一行的数据进行处理。第一行数据作为key,其它行作为value,依次返回每行数据。

import xlrd
from datetime import datetime
from xlrd import xldate_as_tuple


def get_excel_data(file):  # 传入文件路径字符串即可,例如:get_excel_data('account.xlsx')
    workbook = xlrd.open_workbook(file)
    sheet = workbook.sheets()[0]  # 读取第一个sheet
    nrows = sheet.nrows  # 行数
    first_row_values = sheet.row_values(0)  # 第一行数据
    list = []
    num = 1
    for row_num in range(1, nrows):
        row_values = sheet.row_values(row_num)
        if row_values:
            str_obj = {}
        for i in range(len(first_row_values)):
            ctype = sheet.cell(num, i).ctype
            cell = sheet.cell_value(num, i)
            if ctype == 2 and cell % 1 == 0.0:  # ctype为2且为浮点
                cell = int(cell)  # 浮点转成整型
                cell = str(cell)  # 转成整型后再转成字符串,如果想要整型就去掉该行



            elif ctype == 3:
                date = datetime(*xldate_as_tuple(cell, 0))
                cell = date.strftime('%Y/%m/%d %H:%M:%S')




            elif ctype == 4:
                cell = True if cell == 1 else False
            str_obj[first_row_values[i]] = cell
        list.append(str_obj)
        num = num + 1
    return list
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值