python 对 Excel 的文件操作

来源:互联网 发布:windows 没有远程桌面 编辑:程序博客网 时间:2024/05/29 19:09

Python操作Excel读写文件

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

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

下载

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

xlrd 读文件

import xlrddef 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.nrowsfor 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.ncolsfor 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 xlwtbook = 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: 4829cartype: 6qdxs: 31enginetype: 1783mali: 211displacement: 50"""import xlwtimport xlrddef 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)