2021-01-09 16:00:30
weixin_39890543
码龄5年
关注
ab7f79acbc82f90e2db6ee5721f42ab7.png
我们经常谈到Python 在办公自动化方面的能力,用python来处理Excel表格更是其中典型的代表,这个阶段我们会提到xlrd 、xlwt 、openpyxl等处理Excel的利器。最后我们还会提到pandas ,使用padas 你会发现处理数据如此简单高效!
eb518697b01f6d5830ca52f0f499813a.png
xlrd安装
开始菜单-->输入CMD -->pip install xlrd=1.2.0
操作视频如下所示:
这里说明一下为什么要使用xlrd 1.2.0版本, 之前也遇到了这个坑,当你不指定版本时,默认给你安装最新版本xlrd2.0.1 ,但是使用后者读取.xlsx格式的文件时会出现以下报警:
xlrd.biffh.XLRDError: Excel xlsx file;not supported
2.0.1不支持xlsx格式文件,而目前我们使用的Excel2007以上版本生成的文件均是xlsx格式的,所以我们还是使用xlrd 1.2.0 来读取Excel. 当然未来我们还会讲到openpyxl,它不存在版本问题。
检查xlrd是否安装成功:
13c7fbca5f7498dbfb612f9f893fc10d.png
开始菜单-->输入CMD -->输入python-->输入 import xlrd
如果没有报警,那么说明xlrd安装成功
69137235f18f40213e28372e862d3b6a.png
使用xlrd打开Excel
在程序的同级目录下有一个person_data 的Excel,里面有如下数据:
person_data.xlsx:
57313628be8049b09be1c7c9f56b0a4b.png
import xlrdworkbook=xlrd.open_workbook("person_data.xlsx")sheet1=workbook.sheet_by_name("Sheet1")print(sheet1.cell(1,0).value)
第一行:我们导入xlrd库
第二行:我们使用xlrd.open_workbook(path),括号以内是路径名称
第三行:我们使用workbook的sheet_by_name方法并传入“Sheet1”,代表我们按照表格名进行索引,找到“Sheet1”这个表,并将其赋值给sheet1
第四行:我们打印sheet1中的cell(1,0)的值,python是按0开始索引的,所以结合之前的VBA知识,cell(1,0)是哪个单元格呢?
来看看执行结果:
ac6c64308dcb2c9e6b51e0634e9a4733.png
没错,cell(1,0)代表的就是第二行的第一列单元格,即“张一“ 这个名字。
e3e169b089abcc08056be022f89cabf0.png
遍历表格的列或行
事实上只取某个数值并不是我们想要的,有时候我们希望结合循环的方法,将一列或一行的数值取出,这样更有意义:
import xlrdworkbook=xlrd.open_workbook("person_data.xlsx")sheet1=workbook.sheet_by_name("Sheet1")for i in range(1,8):print(sheet1.cell(i,0).value)
第一行:我们导入xlrd库
第二行:我们使用xlrd.open_workbook(path),括号以内是路径名称
第三行:我们使用workbook的sheet_by_name方法并传入“Sheet1”,代表我们按照表格名进行索引,找到“Sheet1”这个表,并将其赋值给sheet1
第四行:我们遍历1-8范围,并把数值赋给i
第五行:我们打印第一列,第2至8行的数据,即姓名值
看看执行结果:
6529ae7788ad62a5dae46fd6d2f40384.png
这样我们就将表格中的数据获取出来了
dab01852cbcb5352cbf4d158dd216952.png
总行数和总列数
很多时候,我们希望表格中的行数是可变的,因为这样可以是记录变得可持续,但是带来的问题是,我们遍历的范围就需要是可变的,如何寻找这个可变的行数变量呢,我们可以使用总行数nrows 和总列数ncols 来计算目前的总列数和总行数:
以上excel为例,我们添加两行数据(红色字体部分):
person_data.xlsx:
82300f6f643082b27f8ddc1178ddbf15.png
现在我们来读取职位为工程师的人员的姓名:
import xlrdworkbook=xlrd.open_workbook("person_data.xlsx")sheet1=workbook.sheet_by_name("Sheet1")max_rows=sheet1.nrowsprint(sheet1.ncols)for i in range(1,max_rows):if sheet1.cell(i,2).value == "工程师":print("姓名:"+sheet1.cell(i,0).value +" 职位:"+sheet1.cell(i,2).value)
第一行:我们导入xlrd库
第二行:我们使用xlrd.open_workbook(path),括号以内是路径名称
第三行:我们使用workbook的sheet_by_name方法并传入“Sheet1”,代表我们按照表格名进行索引,找到“Sheet1”这个表,并将其赋值给sheet1
第四行:sheet1.nrows 代表sheet1的总行数,我们将总行数赋值给max_rows变量
第五行:打印sheet1的最大使用列数 ,即sheet1.ncols
第六行:遍历第2行至max_rows行
第七行:判断第i行第3列的值是否等于“”工程师“ ,如果是,则执行下面代码
第八行:打印姓名以及职位信息
看看执行结果:
a4af0341c5ac005bdf947761ba277786.png
现在即使我们再在person_data.xlsx里面增加数据(如下所示),也无需修改代码了:
0f6ed1fd8955b903f1813ea6bf28ff50.png
使用同样代码执行:
fbefb945b686615c64c5a54162060b6a.png
这样我们就可以让输入者动态输入,而我们的程序仍然可以正常运行。
9da1a8e34a48225da12483e3160fafdf.png
上期答案与本期习题
上期答案:
1.使用python创建一个write_test.txt ,并在里面写入一句话:life is short,I use python
with open('write_test.txt','w') as file_object:file_object.write('Life is short , I use python')
59248d239d2d52331b726b30b6d52559.png
本期习题:
1.创建一个test.xlsx的Excel ,在Excel内填写一行信息,使用python读取这一行信息,并将它打印出来。
代码如下:import redisclass Database: def __init__(self): self.host = 'localhost' self.port = 6379 def write(self,website,city,year,month,day,deal_number): try: key = '_'.join([website,city,str(year),str(month),str(day)]) val = deal_number r = redis.StrictRedis(host=self.host,port=self.port) r.set(key,val) except Exception, exception: print exception def read(self,website,city,year,month,day): try: key = '_'.join([website,city,str(year),str(month),str(day)]) r = redis.StrictRedis(host=self.host,port=self.port) value = r.get(key) print value return value except Exception, exception: print exception if __name__ == '__main__': db = Database() db.write('meituan','beijing',2013,9,1,8000) db.read('meituan','beijing',2013,9,1)简单的介绍一下这两个库,先说xlrd,这个库读Excel比较方便,各种方法使用起来也挺方便:bk = xlrd.open_workbook('your.xls')
sh = bk.sheets()[-1]
上面两句就可以打开Excel表格中的一个sheet,sheets得到的是一个list,存放所有的sheet。
sh.nrows是该sheet中的行数,知道这个后就可以使用for循环来读所有的单元格了:
sh.row(i)[3]这个就代表第i行的第4列。
再看看pyExcelerator,这个用起来有点别扭:
sheets = parse_xls('result.xls')
先打开一个表格,sheets是一个list,包含了所有表格的内容,每一项就是一个sheet,而每个sheet是二元tuple,第一个是该sheet的名字,第二个是一个dict,dict的key是一个二元组,表示单元格的坐标,如(0,0),第一行第一列。
从上面的分析中可以得出要访问Excel中第一个sheet的第一行第一列元素需要:
sheets[0][1][(0,0)]
pyExcelerator也不能得到行列数。
写文件也比较简单:
wb = Workbook()
ws = wb.add_sheet('result')
ws.write(0,0,“hello”)
wb.save('result.xls')
就不解释了:-)
写文件时需要注意直接写Unicode内容进去,而不要写编码过的内容。
本文来源于可可熊的窝 http://cocobear.info/blog , 原文地址: