一、使用Python
对Excel
读写数据
1.模块、包、库概念
Module(模块):扩展名为.py
的文件就可以称作为模块 Package(包):在模块只上的概念,为了方便管理.py
模块文件进行打包。包目录下第一个文件必须是_init_.py
,否则就是普通的文件夹目录,然后是一些模块文件和子目录,加入子目录中也有_init_.py
,那么它就是这个包的子包了 Library(库):具有相关功能模块的集合。这也是Python
的一大特色,即具有强大的标准库、第三方库以及自定义模块 标准库:就是安装Python
是自自带的模块 第三方库:就是由第三方机构发布,具有特定功能的模块,用户也可以自行开发模块供自己和他人使用
2.Excel
读取库xlrd
导入模块的格式:import+模块名 导入xlrd
:import xlrd
,也可以使用别名命名方式import xlrd as xl
,后续可以用xl
代表xlrd
模块 调用的格式为:from+模块名+import+方法名 导入xlrd
模块中的open_workbook
,写法为:from xlrd import open_workbook as owb
,后续可以直接使用owb
代表open_workbook
工作薄对象 ''注意:xlrd
只能读取xls
格式工作薄数据
3.读取Excel
工作薄、工作表信息
在导入读取xls
文件的库之后,则需要读取Excel
文件的相关信息,以下是一些常见的获取工作薄、工作表对象的方法:
import xlrd
wb = xlrd. open_workbook( '工作薄名称.xls' )
wsobj = wb. sheets( )
wsname = wb. sheet_names( )
ws1 = wb. sheet_by_name( '工作表名称' )
ws2 = wb. sheet_by_index( 1 )
ws3 = wb. sheets( ) [ 1 ]
4.读取Excel
行、列信息
import xlrd
ws = xlrd. open_workbook( '工作薄名.xls' ) . sheet_by_name( '工作表名' )
crow = ws. nrows
ccol = ws. ncols
row_data = ws. row_values( 行号)
col_data = ws. col_values( 列号)
cell_data_1 = ws. cell_value( 行号, 列号)
cell_data_2 = ws. cell( 行号, 列号) . value
注意:如果以序号方式获取工作表、单元格的数据,均是从序号0开始的
5.Excel
写入库xlwt
使用安装xlwt
库,具有创建工作薄、工作表、将数据写入到单元格的功能
6.创建Excel
工作薄、工作表和写入单元格
xlwt
可以创建工作薄、保存工作薄,创建工作表以及将数据写入单元格等常见操作
import xlwt
nwb = xlwt. Workbook( encoding = 'utf-8' )
nws = nwb. add_sheet( '工作表名' )
nws. write( 1 , 2 , '要写入的值' )
nwb. save( '工作薄名.xls' )
7.Excel
修改库xlutils
xlutils
可以修改工作薄,要使用xlutils
库就一定要安装xlrd
库和xlwt
库
8.修改工作薄、工作表、单元格
import xlrd
from xlutils. copy import copy
wb = xlrd. open_workbook( '工作薄名.xls' )
nwb = copy( wb)
nws1 = nwb. add_sheet( '工作表名' )
nws2 = nwb. get_sheet( 序号)
nws3 = nwb. get_sheet( '工作表名' )
nws1. write( 行号, 列表, '值' )
nwb. save( '工作薄名.xls' )
注意,最后nwb.save
保存的工作薄可以和打开时工作薄名一样,也可以不一样,如果一样,则是覆盖原工作薄,不一样则是另存工作薄。代码运行时,被修改的工作薄必须关闭。
二、循环语句与分支语句
1.for...in
循环语句
for item in iterable: do something
(1)循环字符串
for循环语句除了遍历指定范围的序列值,也可以遍历向指定的字符串,将字符串中的每个字符逐个输出
for n in 'python' : print ( n)
(2)循环指定范围序列数
如果我们要循环指定范围的数据,可以使用range函数,一般通过使用for循环语句来逐个取得数字 range函数语法为:range(start, stop, [step])
start:计数从start开始,默认是从0开始 stop:技术到stop结束,但不包括stop step:步长,默认是1
for n in range ( 1 , 10 , 2 ) : print ( n)
(3)嵌套循环
for循环与局可以嵌套使用,但每一层for循环语句注意缩进,下面使用for嵌套循环方式完成九九乘法表的制作
for x in range ( 1 , 10 ) : for y in range ( 1 , x+ 1 ) : print ( '%dx%d=%-5d' % ( y, x, y * x) , end = '' )
2.for...in
循环语句应用
(1)批量创建工作薄
实例:使用for循环语句创建1到12月工作薄,每个工作薄中创建一个名为统计表的工作表
import xlwt
for m in range ( 1 , 13 ) : wb = xlwt. Workbook( encoding = 'utf-8' ) wb. add_sheet( '统计表' ) wb. save( '%02d 月.xls' % m)
(2)制作九九乘法表
实例:将九九乘法表写入Excel表格中,只需要定位好对应的单元格,然后将格式化好的数据写入单元格即可
import xlwt
wb = xlwt. Workbook( encoding = 'utf-8' )
ws = wb. add_sheet( '乘法表' )
for x in range ( 1 , 10 ) : for y in range ( 1 , x + 1 ) : ws. write( x, y, '%dx%d=%d' % ( x, y, x * y) )
wb. save( '乘法表.xls' )
3.while
循环语句
while condition: do something
n = 0
while n < 5 : n += 1 print ( n)
x, y = 0 , 0
while x < 9 : x += 1 while y < x: y += 1 print ( '%dx%d=%02d\t' % ( y, x, x * y) , end = '' ) y = 0 print ( '' )
4.while
循环语句应用
(1)读取工作薄信到列表
实例:将”招生表.xls“工作表下的所有工作表名称写入”统计结果.xls“工作薄下的“统计表”,并且哥每个工作表编写一个序号
import xlrd, xlwt
wb = xlrd. open_workbook( '招生表.xls' )
nwb = xlwt. Workbool( encoding = 'utf-8' )
nws = nwb. add_sheet( '统计表' )
n = 0
while n < wb. sheets( ) . __len__( ) : nws. wirte( n, 0 , '表%d' % n) nws. wirte( n, 1 , wb. sheets( ) [ n] . name) n += 1
nwb. save( '统计结果.xls' )
(2)批量创建工作薄、工作表
实例:新建20152018年工作薄文件,每个工作薄文件中再分别新建1 12月的工作表
import xlwt
y, m = 2015 , 1
while y <= 2018 : nwb = xlwt. Workbook( encoding = 'utf-8' ) while m<= 12 : nwb. add_sheet( '%d年%d月' % ( y, m) ) m += 1 nwb. save( '%d年.xls' % y) y += 1 m = 1
5.if
条件语句
if conditional test: do something
score = input ( '请输入分数:' )
score = int ( score)
if score > 90 : print ( '优秀' )
6.if...else
条件语句
判断分数大于等于90分,返回“优秀”,否则返回“普通”
score = input ( '请输入分数:' )
score = int ( score)
if socre > 90 : print ( '优秀' )
else : print ( '普通' )
7.if
语句应用
(1)将筛选结果写入新工作薄
实例:将指定工作薄指定工作表下语文、数学两列成绩同时大于等于80的记录写入新工作薄
import xlrd, xlwt
wb = xlrd. open_workbook( '成绩表.xls' )
ws = wb. sheet_by_name( '分数表' )
nwb = xlwt. Workbook( encoding = 'utf-8' )
nws = nmb. add_sheet( '结果' )
n, m = 0 , 0
while n < ws. nrows - 1 : n += 1 if ws. cell_value( n, 1 ) >= 80 and ws. cell_value( n, 2 ) >= 80 : m += 1 nws. write( m, 0 , ws. cell_value( n, 0 ) ) nws. write( m, 1 , ws. cell_value( n, 1 ) ) nws. write( m, 2 , ws. cell_value( n, 2 ) )
nws. write( 0 , 0 , '姓名' )
nws. write( 0 , 1 , '语文' )
nws. write( 0 , 2 , '数学' )
nwb. save( '筛选结果.xls' )
(2)根据总分判断等级
import xlrd
from xlutils. copy import copy
wb = xlrd. open_workbook( '成绩单.xls' )
ws = wb. sheet_by_name( '分数表' )
nwb = copy( wb)
nws = nwb. get_sheet( '分数表' )
n = 0
while n < ws. norws - 1 : n += 1 subtotal = ws. cell_value( n, 1 ) + ws. cell_value( n, 2 ) if subtotal >= 180 : nws. write( n, 3 , '优秀' ) elif subtotal >= 160 : nws. write( n, 3 , '良好' ) elif subtotal >= 120 : nws. write( n, 3 , '中等' ) else : nws. write( n, 3 , '差' )
nwb. save( '成绩表.xls' )
8.break
语句
终止break语句所在的循环,当循环或判断之行动break语句时,即使判断条件为True或者序列尚未完全被遍历,都会跳出循环或判断 for循环语句中的break应用
for c in 'abcdefg' : if c == 'd' : break else : print ( c)
n = 0
while True : n += 1 if n == 5 : break else : print ( n)
9.continue
语句
当循环或判断执行到continue
语句时,continue
后的语句将不再执行,会跳出当次循环,继续执行循环中的下一次循环 for循环语句中的continue应用
for c in range ( 1 , 11 ) : if c == 5 : print ( '我是5' ) continue print ( c)
n = 0
while n < 6 : n += 1 if n == 3 : print ( '我是3' ) continue print ( n)
10.综合应用
实例:要求统计出业绩表中每个人的累计业绩,大于等于1000表示达标,需要统计出开始达标的月份以及业绩
import xlrd
from xlutils. copy import copy
wb = xlrd. open_workbook( '业绩表.xls' )
ws = wb. sheet_by_name( 'Sheet1' )
nwb = copy( wb)
nws = nwb. get_sheet( '统计结果' )
subtotal, n = 0 , 0
for r in range ( 1 , ws. nrows) : for c in range ( 1 , 13 ) : subtotal += ws. cell_value( r, c) if subtotal >= 1000 : n += 1 nws. write( n, 0 , ws. cell_value( n, 0 ) ) nws. write( n, 1 , '%d月份' % c) nws. write( n, 2 , subtotal) break subtotal = 0
nwb. save( '业绩表.xls' )
三、字符串处理技术
1.字符串切片
字符串时最常用的一种数据类型,Python中的字符串时不能修改的,只能做提取、拆分、合并重组等操作
(1)提取单个字符
提取字符串中指定的位置的单个字符,表示方式为:str[位置]
,既可以从开头计算,也可以从结尾计算 从开头计算单个字符的表示方法
str = 'Excel'
print ( str [ 0 ] , srt[ 2 ] )
str = 'Excel'
print ( str [ - 1 ] , str [ - 2 ] )
(2)提取多个字符
提取字符串中某一段字符的表示方式为:str[开始位置:结束位置]
str = 'Excel'
print ( str [ 1 : 3 ] )
print ( str [ : 3 ] )
print ( str [ 2 : ] )
print ( str [ - 3 : - 1 ] )
print ( str [ - 3 : ] )
print ( str [ : ] )
字符串提取还可以设置步长值,表示方式为:str[开始位置:结束位置:步长值]
2.字符串切片应用
(1)整理工作表数据
将成表工作薄分数表中的第1列的部门和姓名分别提取到新工作博中的不同列
import xlrd, xlwt
wb = xlrd. open_workbook( '成绩表.xls' )
ws = wb. sheet_by_name( '分数表' )
nwb = xlwt. Workbook( encoding= 'utf-8' )
nws = nwb. add_sheet( 'Sheet1' )
n = 0
for c in ws. col_vlaues( 0 ) : nws. write( n, 0 , c[ : 3 ] ) nws. write( n, 1 , c[ 4 : ] ) nws. write( n, 2 , ws. cell_value( n, 1 ) ) n += 1
nwb. save( '结果表.xls' )
3.字符串长度(个数)统计
(1)len
len
方法返回对象(字符、列表、元组等)长度或项目个数
print ( len ( 'Excel' ) )
(2)count
count
方法用于统计字符串里指定字符串出现的次数,可选参数为在字符串搜索的开始与结束位置语法格式:str.count(sub, start=0, end = len(string))
str
:被搜索的父字符串sub
:搜索的子字符串start
:字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0end
:字符串中结束搜索的位置。字符中第一个字符的索引为0。默认为字符串的最后一个位置
s = '销售部-张三,财务部-李四,销售部-王五,销售部-琳琳'
print ( s. count( '销售部' ) )
print ( s. count( '销售部' ) , 5 )
print ( s. count( '销售部' , 5 , 18 ) )
实例:分别统计“优,良,中,差”4个等级出现的次数
import xlrd
wb = xlrd. open_workbook( '等级表.xls' )
ws = wb. sheet_by_name( 'Sheet1' )
n, m = 0 , 0
for l in '优良中差' : while n < ws. nrows - 1 : n += 1 m += ws. cell_value( n, 1 ) . count( ) print ( m) n, m = 0 , 0
4.字符串查找
(1)index
index
方法用于从字符串中找出某个对象第一个匹配项的索引位置,如果查找的字符串不存在会报一个异常语法格式:str.index(sub, [start = 0], [end = len(str)])
str
:父字符串sub
:指定检索的子字符串start
:可选参数,开始索引,默认为0(可单独指定)end
:可选参数,结束索引,默认为字符串的长度(不能单独指定)
s = 'A组89,B组98,C组100,D组78,B组74'
print ( s. index( 'B组' ) )
print ( s. index( 'B组' , 6 ) )
print ( s. index( 'B组' , 6 , 15 ) )
(2)find
find
方法从字符串中找出某个子字符串,第一个匹配项的索引位置,该方法与index
方法一样,如果子字符串不在字符串中不会报异常,而是返回-1实例:统计等级“优”在下半年数量
import xlrd
from xlutils. copy import copy
wb = xlrd. open_workbook( '等级表.xls' )
ws = wb. sheet_by_name( 'Sheet1' )
nwb = copy( wb)
nws = nwb. get_sheet( 'Sheet1' )
n = 0
while n < ws. nrows - 1 : n += 1 s = ws. cell_value( n, 1 ) nws. write( n, 2 , s. count( '优' , s. find( '\n' ) ) )
nwb. save( '等级表.xls' )
5.字符串的替换
replace
方法用于把字符串中指定的就子字符串替换成指定的新子字符串,如果指定count
可选参数则替换指定的次数,默认全部替换语法格式:str.replace(old, new, [count = str.count(old)])
old
:指定的就子字符串new
:指定的新子字符串count
:可选参数,替换的次数,默认为指定的旧子字符串在字符串中出现的总次数
S = 'A组-优秀;B组-良好;C组-优秀;D组-优秀'
print ( S. replace( '优秀' , '(晋级)' ) )
print ( S. replace( '优秀' , '(晋级)' , 1 ) )
print ( S. replace( '优秀' , '(晋级)' , 2 ) )
import xlrd
from xlutils. copy import copy
wb = xlrd. open_workbook( '等级表.xls' )
ws = wb. sheet_by_name( 'Sheet1' )
nwb = copy( wb)
nws = nwb. get_sheet( 'Sheet1' )
n = 0
while n < ws. nrows - 1 : n += 1 val = ws. cell_vlaue( n, 0 ) nws. write( n, 1 , val. replace( '-' , '(' , 1 ) . replace( '-' , ')' , 1 ) )
nwb. save( '替换格式等级表.xls' )
6.字符串的拆分与合并
(1)split
split
方法拆分字符串。通过指定分隔符对字符串进行切片,并返回分割后的字符串列表list语法格式:str.split(str = '', num = string.count(str))
str
:表示为分隔符,默认为空格,但是不能为空('')
,若字符串中没有分隔符,则把整个字符串作为列表的一个元素num
:表示分割次数。如果存在参数num
,则仅分隔成num+1
个子字符串,并且每个子字符串可以付给新的变量
s = '张三、李 四、王二 麻子、小明'
print ( s. split( ) )
print ( s. split( '、' ) )
print ( s. split( '、' , 2 ) )
print ( list ( s) )
(4)join
join
方法用于将序列中的元素以指定的爱抚连接成一个新的字符串语法格式:str.join(sequence)
sequence
:要连接的元素序列、字符串、元素、字典
l = [ 'a' , 'b' , 'c' ]
print ( '-' , l)
四、列表处理技术
1.列表基础
列表是python中最常用的对象,熟练掌握列表的各种操作非常关键。列表的格式为[元素1,元素2,元素3...]
列表中元素的数据类型,可以是任意数据类型,但要注意正确的表达方式 列表中可以嵌套列表
2.列表切片
python中符合序列的有序序列都支持切片,例如:列表、字符串、元组 语法格式:[start:end:step]
start
:起始索引,从0开始,-1表示结束end
:结束索引step
:步长,步长为正时,从左向右取值;步长为负时,反向取值 注意切片的结果不包含结束索引,即不包含最后一位,-1代表列表的最后一个位置索引
l = [ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' ]
print ( l[ 2 : 6 ] )
print ( l[ : 4 ] )
print ( l[ 5 : ] )
print ( l[ - 5 : - 2 ] )
print ( l[ - 3 : ] )
print ( l[ - 6 : 6 ] )
print ( l[ 2 : - 1 ] )
print ( l[ : ] )
print ( l[ : : 2 ] )
3.列表的增加、删除、修改
(1)列表元素的修改
l = [ 'a-黄瓜' , 'b-南瓜' , 'c-冬瓜' , 'd-苦瓜' , 'e-西瓜' ]
l[ 2 ] = 'c-我不是冬瓜'
(2)列表元素的增加
l = [ '张三' ]
l = [ '李四' ] + l
l. append( '王二' )
l. insert( 2 , '麻子' )
(3)列表元素的删除
l2 = [ 'a-黄瓜' , 'b-南瓜' , 'c-冬瓜' , 'd-苦瓜' , 'e-西瓜' ]
l2. pop( )
l2. pop( 0 )
l3 = [ 'a-黄瓜' , 'b-南瓜' , 'c-冬瓜' , 'd-苦瓜' , 'e-西瓜' ]
l3. remove( 'c-冬瓜' )
l4 = [ 'a-黄瓜' , 'b-南瓜' , 'c-冬瓜' , 'd-苦瓜' , 'e-西瓜' ]
del l4[ - 2 ]
l4 = [ 'a-黄瓜' , 'b-南瓜' , 'c-冬瓜' , 'd-苦瓜' , 'e-西瓜' ]
l5. clear( )
4.实例应用
import xlrd
from xlutils. copy import copy
wb = xlrd. open_workbook( '成绩统计表.xls' )
ws = wb. sheet_by_name( '成绩' )
nwb = copy( wb)
nws = nwb. get_sheet( 'Sheet2' )
n = 0 ; m = 0
while n < ws. nrows - 1 : n += 1 l = ws. cell_value( n, 1 ) . split( '-' ) [ 1 : : 2 ] for v in l: m += int ( v) nws. write( n, 0 , ws. cell_value( n, 0 ) ) nws. writ( n, 1 , m) m = 0
nwb. save( '成绩统计表.xls' )
5.列表操作符
(1)基础操作符
print ( [ 1 , 2 , 3 ] + [ 100 , 200 ] )
print ( [ 1 , 2 , 3 ] * 4 )
print ( 1 in [ 1 , 2 , 3 ] )
import xlrd
from xlutils. copy import copy
wb = xlrd. open_workbook( '值班表.xls' )
ws = wb. sheet_by_name( '值班表' )
nwb = copy( wb)
nws = nwb. get_sheet( '值班表' )
r = 0
while r < ws. nrows - 1 : r += 1 row = ws. row_values( r) if '小明' in row: nws. write( r, 6 , '√' ) else : nws. write( r, 6 , 'x' )
nwb. save( '值班表.xls' )
6.列表操作符
列表推导式是Python基础,好用又重要的功能,也是最受欢迎的Python特性之一,可以说掌握它是成为合格Python程序员的基本标准。本质上可以吧列表推导式理解成一种集合了转换和筛选共功能的函数,通过这个函数把一个列表转换成另一个列表。注意是另一个新列表,原列表保持不变
(1)列表推导
(2)列表嵌套推导
[表达式 for 变量1 in 列表1 for 变量2 in 列表2]
(3)条件列表推导
[表达式 for 变量1 in 列表 if 条件]
l1 = [ '83' , '98' , '91' , '100' ]
l2 = [ x for x in l1]
print ( l2)
l3 = [ [ 98 , 86 , 74 , 85 ] , [ 96 , 99 , 75 , 92 ] , [ 69 , 93 , 87 , 85 ] ]
l4 = [ [ x+ 100 for x in l] for l in l2]
print ( l4)