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)