python 对 Excel 的文件操作

Python操作Excel读写文件

Python操作excel和csv或者txt不同的是,读写需要的不是同一个包,xlrd和xlwt,其作用一目了然。
今天只探究一下写操作好了,也就是xlwt包的应用。
干脆都写 .^_^.

  • 这是个方便,但是偶尔很鸡肋的包,那就是Excel的index上限-65536
  • 至于为什么,接下来会详述,直接上代码

下载

 不论是2.x还是3.x版本的python都可以直接pip到这两个包.

xlrd 读文件

import xlrd
def open_excel(file= 'myfile.xls'):
      try:
          data = xlrd.open_workbook(file)
          return data
      except Exception,e:
          print str(e)

这是比较规范的写法,但是一般来讲,我会选择简洁一点的语句:

'''已有这个myfile文件'''
rexcl = xlrd.open_workbook('myfile'.xls")
worksheet = rexcl.sheet_by_name(u'Sheetname')

获取文件内所有表的表名

sheetsname = rexl.sheet_name()

定位到sheet的方法有三种

'''通过sheet_namel'''
worksheet1 = workbook.sheet_by_name(u'Sheet1')
'''通过序列顺序'''
worksheet2 = workbook.sheets()[1]
'''通过sheet_index'''
worksheet1 = workbook.sheet_by_index(0)

遍历

'''遍历sheet1中所有行row'''
num_rows = worksheet.nrows
for cur_row in range(num_rows):
    row_value = worksheet.row_values(cur_row)
    print('row%s is %s' %(cur_row,row_value))

'''遍历sheet1中所有列col'''
num_cols = worksheet.ncols
for cur_col in range(num_cols):
    col_value = worksheet.col_values(cur_col)
    print('col%s is %s' %(cur_col,col_value))

'''遍历sheet1中所有单元格cell'''
for rown in range(num_rows):
    for coln in range(num_cols):
        cell = worksheet.cell_value(rown,coln)
        print cell

获取单个页面的行列数

nrows = worksheet.nrows()
ncols = worksheet.ncols()

xlwt 写文件

接下来来看一看写文件,有了读文件的基础,写文件就很简单了
创建workbook和sheet对象

Import xlwt
book = xlwt.Workbook(encoding="utf-8", style_compression=0)
'''创建一个Wordbook对象,相当于创建了一个Excel文件'''
sheet = workbook.add_sheet('worksheet',cell_overwrite_ok=True)
'''创建一个sheet对象,一个sheet对象对应Excel文件中的一张表格'''

'''写入的过程很简单'''
worksheet.write(0,0,'this should overwrite1')
#write(cur_row,cur_col,value)参数比对

实例代码

内附详解

#-- 数据整理,对缺失数据进行匹配--#
#!/usr/bin/env
# -*- coding: utf-8 -*-
# @Date     : 2017/9/2
# @Version  : python_3.7
"""
kaipiao count = 191228  (include index -1)
carmodel: 4829
cartype: 6
qdxs: 31
enginetype: 1783
mali: 211
displacement: 50
"""
import xlwt
import xlrd

def kaipiaoProcess():
    bookgengzheng = xlrd.open_workbook('D:\童享\pycharmproject\kaipiao\gengzheng.xlsx')
    book = xlrd.open_workbook('D:\童享\pycharmproject\kaipiao\kaipiao.xlsx')

    '''以要求的格式将系统文件写入系统数据表中'''
    booknew = xlwt.Workbook(encoding="utf-8", style_compression=0)

    kaipiaoname = ['kaipiao1', 'kaipiao2', 'kaipiao3', 'kaipiao4', 'kaipiao5']
    '''要打开多个sheet的原因是在操作Excel写数据时,每一个sheet index上限是65536
       对!这里就是超级鸡肋的地方!1页数据只能写这么多!'''

    carmodel = bookgengzheng.sheet_by_name('carmodel')
    dataCarModel = []
    #针对每一条数据空缺的项目进行匹配
    for cur_row in range(carmodel.nrows):
        cur_value = carmodel.row_values(cur_row)
        dataCarModel.append(cur_value)

    '''省略掉不少读取sheet内容的code'''

    flag = 0   #这里的flag用来控制我的新sheet生成
    table = book.sheet_by_name('Sheet1')
    nrow = table.nrows
    for cur_row in range(0, nrow):
        row_value = table.row_values(cur_row)
        for i in range(len(dataCarModel)):
            if (row_value[6] == dataCarModel[i][0]):
                row_value[7] = dataCarModel[i][1]

                '''中间省去的都是匹配数据的代码'''
        #对当前的读取行数进行判断,一但到临界值(60000)就 add_sheet,名字不换,但是write的权限给了新的sheet。       
        if ( cur_row%60000 == 0 ):
            tablenew = booknew.add_sheet(kaipiaoname[flag], cell_overwrite_ok=True)
            flag = flag + 1
        #行内按列写入数据
        for i in range(len(row_value)):
            tablenew.write(cur_row%60000, i, row_value[i])
    booknew.save("kaipiaonew.xlsx")

if __name__ == '__main__':
    kaipiaoProcess()

这次的code是以实例处理为目标写的,但是为什么选择这个,主要原因是想要成这个机会把一个无奈之下逼出来的代码段po一下,看网上也没找到合适的,解决写入数据上限的方法。

单纯的修改save()中的文件后缀名,并不能解决问题
曾经尝试xlutils.copy,将原本的读入数据进行copy,尝试越过xls的这个障碍,因为xlsx的数据上限大约是150000,所以打算获取一下这个便利,但是尝试的结果还是一样,上限依旧存在。
网上没有任何解决方案,所以考虑,是不是可以连建多表,尝试以后发现可行,特此作为一个解决方案吧。

顺带加一个xlutils.copy的使用,还是一样的,pip轻松地就能获取到。
lutils.copy 这是一个神奇的包,可以copy另一个工作薄,用法如下:

book = xlutils.copy.copy(‘anotherBookName’)

当原本为读的文件需要更改为可写文件时,可以不用重新import xlwr,而是使用get_sheet()或者sheet_by_name()函数来获取原本没有的write权限。

wb = book.get_sheet(0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值