Python:xlrd、xlwt、xlutils库的学习笔记【第四章】字符串处理技术

这篇学习笔记介绍了Python中处理字符串的各种技术,包括切片、统计长度和条件统计、搜索定位、替换以及拆分和合并。通过实例展示了如何根据身份证号判断性别、统计字符串出现次数、搜索子字符串位置、替换不规范分隔符以及汇总多表数据。这些技巧在数据处理中非常实用。
摘要由CSDN通过智能技术生成

注:该学习笔记是根据曾志贤老师编写的《从Excel到Python,用Python轻松处理Excel数据》所学习整理的笔记。

第四章 字符串处理技术

一、单、多字符切片

1、字符串切片

字符串切片就是截取字符串。可以利用字符串的切片特性进行提取、拆分、合并等操作,但不能对字符串进行修改。

2、单字符切片

单字符切片是对字符串中指定位置的单个字符进行截取。
语法结构:字符串[索引位置],索引位置的序号是从0开始的。

txt='python基础的学习'
print(txt[0]) #正数,从左至右计算位数。 返回  p
print(txt[-1]) #负数,从右至左计算位数。 返回 习

3、多字符切片

语法结构:字符串[开始索引:结束索引:步长]

txt='python基础的学习'
print(txt[2:9]) #返回 thon基础的
print(txt[-10:-3]) #返回 ython基础
print(txt[:7])  #返回 python基
print(txt[:-5])  #返回 python
print(txt[7:])  #返回 础的学习
print(txt[-5:])  #返回 基础的学习
print(txt[2:-5])  #返回 thon
print(txt[-10:7])  #返回 ython基
print(txt[:])  #返回 python基础的学习
print(txt[::2])  #间隔一个字符获取 返回 pto基的习
print(txt[::-1])  #反转字符串  返回 习学的础基nohtyp
print(txt[::-2])  #反转字符串,间隔一个字符获取  返回 习的基otp
案例一、字符串切片根据身份证号判断性别

如图所示,在“员工信息”工作簿中的“信息”工作表,对B列身份证号码进行性别判断,18位身份证号,判断第17位数字;15位身份证号,判断第15位数字。如果数字是奇数,则性别为男性,反之为女性。将判断的结果写在C列,并另存。

在这里插入图片描述

import xlrd 
from xlutils.copy import copy 
wb=xlrd.open_workbook('员工信息.xls')
ws=wb.sheet_by_name('信息')
nwb=copy(wb)
nws=nwb.get_sheet('信息')
nws.write(0,2,'性别')
for num in range(1,ws.nrows):
    txt=ws.cell_value(num,1) #读取num行的身份证号
    sex_num=int(txt[14:17][-1]) #转换为整数型,然后截取15位至17位(左闭右开),然后提取最后1位。
    if  sex_num % 2 ==1: #判断余数为单数还是双数
        sex='男'
    else:
        sex='女'
    nws.write(num,2,sex) #写入指定位置
nwb.save('员工信息-1.xls')

在这里插入图片描述

二、字符串统计

1、统计字符串长度

使用len函数,对字符串、列表、元组等对象的长度或者项目个数进行统计。
语法结构:
len(s)
参数说明:

  • s:参数可以是序列,例如字符串、元组、列表、字典、集合等。
txt='python第四章的学习'
print(len(txt)) #对字符串的长度进行统计 返回 12
txt=[2,3,5,7,10]
print(len(txt)) #对列表的个数进行统计  返回 5

2、按条件统计字符串

使用count函数,对指定写字符串在父字符串中出现的次数进行统计。
语法结构:
count(sub[,start[,end]])
参数说明:

  • sub:必选参数,搜索的子字符串。
  • start :可选参数,字符串开始搜索的位置,默认从第0字符开始。
  • end:可选参数,字符串结束搜索的位置,默认搜索到字符串的最后。
txt='python第四章python的学习python的字符串统计学习'
print(txt.count('py')) #在“txt”中寻找“py”出现的次数
print(txt.count('py',2)) #在“txt”中的第3位字符开始寻找“py”出现的次数
print(txt.count('py',2,20)) #在“txt”中的第3位至第21位间,寻找“py”出现的次数
案例一、字符串统计各等级出现的次数

将下“成绩”工作簿中的,“成绩”工作表中的数据,分别按照:优、良、中、差统计次数。并将数据写在C列。

在这里插入图片描述

import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('成绩.xls')
ws=wb.sheet_by_name('成绩')
nwb=copy(wb)
nws=nwb.get_sheet('成绩')
for num in range(1,ws.nrows):
    ws_val=ws.cell_value(num,1)
    txt=''
    for num1 in '优良中差':
        i='{}:{}'.format(num1,ws_val.count(num1))
        txt +=i
    nws.write(num,2,'{}'.format(txt))
nwb.save('成绩-1.xls')

在这里插入图片描述

三、字符串搜索

搜索子字符串在父字符串中第一次出现的位置,可以使用index函数或者find函数。
注意:index函数与find函数都是模糊匹配,并非精准匹配。
比如字符串:‘甲24,甲2’
查找’甲2’字符时,会返回’甲24’字符的位置,因为’甲24’字符包含了’甲2’字符。

1、使用index函数搜索字符串位置

index函数用于从字符串中找出子字符串第一个匹配项的索引位置,如果查找的字符串不存在,则返回错误提示。
语法结构:
index(sub[,start[,end]])
参数说明:

  • sub:必选参数,搜索的子字符串。
  • start :可选参数,字符串开始搜索的位置,默认从第0字符开始。
  • end:可选参数,字符串结束搜索的位置,默认搜索到字符串的最后。
txt='甲0,乙3,丙6,丁9,甲12,乙16,丙20,丁24'
print(txt.index('丁')) #返回 9
print(txt.index('丁',10)) #返回 24
print(txt.index('丁',1,12)) #返回 9
print(txt.index('甲甲')) #程序报错,因父字符串中无“甲甲”字符

2、使用find函数搜索字符串位置

find函数与index函数的功能一样,唯一的区别就是find函数不会报错,如果未匹配上将会返回“-1”。
语法结构:
find(sub[,start[,end]])
参数说明:

  • sub:必选参数,搜索的子字符串。
  • start :可选参数,字符串开始搜索的位置,默认从第0字符开始。
  • end:可选参数,字符串结束搜索的位置,默认搜索到字符串的最后。
txt='甲0,乙3,丙6,丁9,甲12,乙16,丙20,丁24'
print(txt.find('丁')) #返回 9
print(txt.find('丁',10)) #返回 24
print(txt.find('丁',1,12)) #返回 9
print(txt.find('甲甲')) #因为在父字符串中找到“甲甲”字符串,故返回 -1
案例一、字符串搜索提取指定位置的信息

在“信息表”工作簿中的“信息表”工作表中,将A列的部门信息提取到对应的B列中。

在这里插入图片描述

import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('信息表.xls')
ws=wb.sheet_by_name('信息表')
nwb=copy(wb)
nws=nwb.get_sheet('信息表')
for num in range(1,ws.nrows):
    ws_val=ws.cell_value(num,0)
    i=ws_val.find('(') #获取截取字符串的开始位置
    j=ws_val.find(')') #后去截取字符串的结束位置
    txt=ws_val[i+1:j]
    nws.write(num,1,txt)
nwb.save('信息表-1.xls')

在这里插入图片描述

四、字符串替换

替换字符串的本质就是有条件的对字符串进行修改。替换后的字符串生成新的内存地址,并非替换原有字符串的内存地址。

1、字符串替换方法

replace函数用于把字符串中指定的旧字符串替换为指定的新字符串,默认全部替换。
语法结构:
replace(old,new[,count])
参数说明:

  • old:必选参数,被替换的旧字符串。
  • new:必选参数,新字符串,用于替换旧字符串。
  • count:可选参数,替换的次数,默认替换所有出现的旧字符串。
txt='A组-优秀;B组-良好;C组-优秀;D组-优秀;E组-一般'
print(txt.replace('优秀','晋级',0)) #将不进行替换
print(txt.replace('优秀','晋级')) #将所有 优秀 替换为 晋级
print(txt.replace('优秀','晋级',1)) #将第一个 优秀 替换为 晋级
print(txt.replace('优秀','晋级',2)) #将前两个 优秀 替换为 晋级
案例一、字符替换整理不规范的分隔符

将“员工表”工作簿中的“员工表”工作表里的B列名单进行处理,将每个姓名之间的分隔符统一成“-”。并将整理后的写在C列。

在这里插入图片描述

import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('员工表.xls')
ws=wb.sheet_by_name('员工表')
nwb=copy(wb)
nws=nwb.get_sheet('员工表')
for num in range(1,ws.nrows):
    txt=ws.cell_value(num,1) #提取需要替换的字符串
    for i in '、\|': #将需要替换的符号进行循环
        txt=txt.replace(i,'-') #将提取的字符串,替换后,在赋值给自己。
    nws.write(num,2,txt)
nwb.save('员工表-1.xls')

在这里插入图片描述

五、字符串拆分和合并

1、拆分字符串为列表

split函数用于拆分字符串,可以指定分隔符对字符串进行切片,并返回拆分后的字符串列表。
语法结构:
split([sep][,maxsplit])
参数说明:

  • sep:可选参数,表示分隔符,默认为空格(’ ‘),但不能为空(’')。分隔符可以是单个字符,也可以是多个字符。如果是多个字符,则被看作为一个整体。
  • maxsplit:可选参数,表示要执行的最大拆解分数。-1为默认值,表示无限制。
txt='10 20 50'
txt1='7|9|10'
print(txt.split()) #默认以空格进行拆分 返回 ['10', '20', '50']
print(txt1.split('|')) #按照指定字符进行拆分 返回 ['7', '9', '10']
print(txt1.split('|',1)) #按照指定字符,指定拆分次数进行拆分 返回 ['7', '9|10']

2、合并列表为字符串

使用join函数进行合并
语法结构:
join(iterable)
参数说明:

  • iterable:必选参数,可以是列表、元组等可迭代的对象(可循环的对象),但其中的值只能为字符串,不能是其他数据类型。
txt=['甲','18','财务部'] #列表
print('-'.join(txt)) #以“-”作为分隔符,将列表合并为字符串 返回 甲-18-财务部
txt1={'甲','18','财务部'} #集合
print('-'.join(txt1)) #以“-”作为分隔符,将集合合并为字符串 返回 甲-18-财务部
txt2=('甲','18','财务部') #元组
print('-'.join(txt2)) #以“-”作为分隔符,将元组合并为字符串 返回 甲-18-财务部
案例一、字符串拆分合并汇总多表中的不规范数据

将“业绩”工作簿中的,“1季度”、“2季度”、“3季度”、“4季度”工作表汇总到一个新工作表中。

在这里插入图片描述

import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('业绩.xls')
ws_s=wb.sheets() #所有工作表
nwb=copy(wb)
nws=nwb.add_sheet('统计结果')
nws.write(0,0,'季度')
nws.write(0,1,'统计结果')
num,nums,lst=0,0,[]
for ws in ws_s: #循环所有工作表
    num +=1 #该变量作为统计结果工作表的行号
    for row_num in range(1,ws.nrows): #循环工作表的所有行
        name=ws.cell_value(row_num,0) #读取A列
        ws_val=ws.cell_value(row_num,1) #读取B列
        for i in ws_val.split('、'): #将B列拆分成列表并进行循环
           nums +=int(i) #将拆分的列表类型转换为int,在进行累加
        lst +=[name+':'+str(nums)] #将A类名字与累加好的数值按照列表的形式进行组合,并进行累加。
        nums=0 #将累加清空
    nws.write(num,0,ws.name) #给统计结果工作表的A列输出值
    nws.write(num,1,'\n'.join(lst)) #将lst列表进行组合,给统计结果工作表的B列输出值
    lst=[] #将列表清空
nwb.save('业绩-1.xls')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值