六、Python-字符串编码



 



最早的编码为ASCII码(包含0-9、A-Z、a-z、符号(空格、制表符等)),最多支持256个符号(每个符号占1字节)



GBK/GB2312:我国制定的中文编码标准,一个字节表示因为字母,两个字节表示中文字符



UTF-8编码:国际通用编码,一个字节表示英文字符,三个字节表示中文



Python中常用字符串类型:



str:使用Unicode字符(一个字符代表若干个字节)



eg:“拼搏到感动自己”



bytes:二进制数据,是带有b成对的字符串(用“”或‘’表示)



eg:b'\xd2\xb0'和b'mr'



str和bytes不能拼接在一起使用,str要存放在磁盘或者在网络上传输,需要把str转换层bytes



使用encode()方法转换层bytes



一、字符串编码转换:str.encode([endoding="utf-8"][,errors= "strict"])



  • str:字符串名
  • endoding="utf-8"(可选参数):指定编码时使用的编码
  • 默认使用utf-8,当只有这一个参数时,可以省略的携程utf-8)
  • 如果要设置问简体中文,可设置为GB2312
  • errors= "strict"(可选参数):指定错误处理方式
  • strict:遇到异常立即抛出错误(默认值)
  • ignore:忽略非法字符
  • replace:用?替换异常错误
  • xmlcharrefreplace:使用xml字符的引用



eg:str1 = "野渡无人舟自横"



byte = str1.encode("utf-8")



byte1 = str1.encode("GBK")



print(str1)



print(byte)



二、使用decode()方法解码:str.decode([encoding="utf-8"][,errors="strict"])



可选同encode一样



news = byte.decode("utf-8")



解码时的,指定编码时需要和转码时指定的编码方式需要一致



三、字符串常用操作



单引号、双引号、三引号都是标示字符串的(单引号和双引号必须写在一行上,三引号可以写在多行上)



  • 拼接字符串:序列相加,把多个字符串相加,拼成一个字符串(字符串不允许直接与其他数据类型拼接)



eg:str1 = "我今天一共走了"



num = 17890



str2 = "步"



print(str1 + str(num) + str2)



eg:str1 = "程序员甲:搞IT太辛苦了,我想换行…怎么办?"



str2 = "程序员乙:敲一下回车键"



print(str1 + "\n" + str2)



  • 计算字符串的长度:使用len(string) #不管多少个字,都按照一个字符串来计算



  • 指一个字符串所占的字节数(英文字母、数字、下划线等占1字节,中文汉字占2-4个字节)
  • 不通的编码方式,得出的结果可能会不一样



eg:str1 = "人生苦短,我用Python"



print(len(str1))



print(len(str1.encode())) #计算使用utf-8编码的长度



print(len(str1.encode("gbk")))



四、截取字符串:其实就是切片方法



  • 字符串的索引:从左到右依次增加(从0开始)



str2 = str1[2] #获取第二个字符串(获取指定位置的值)



str3 = str1[2:] #获取第二个字符串到末尾的字符串



str4 = str1[:5] #获取左边5个字符串



str5 = str1[2::2] #获取步长为2,开始位置为2的的值



  • 获取切片的位置不存在时,抛出一个空值,获取的指定索引值不存在时,或抛出错误代码(可以用try…except捕获错误,后续会讲到)



idcard = "123456199006277890"



birthday = idcard[6:10]+ "年" + idcard[10:12] + "月" + idcard[12:14] + "日"



print("出生日期为:" + birthday + ",生日为:" + birthday[5:])



  • 分割字符串:listname = str.split(sep,maxsplit) ---splist方法



listname:返回的值 str:被切分的对象



sep:指定分隔符(可包含多个字符,默认为空白符None(空格、换行、制表符、\t等))



maxsplit:指定分割次数(不指定该参数或者为-1时,则分割次数没有限制;否则返回结果列表的元素个数最多为maxsplit+1;要指定maxsplit必须指定sep)



eg:a = "你 有 多 自信, \n 世界 就有 多 相信你!"



print(a.split())



print(a.split(" "))



print(a.split(" "))



print(a.split(" ",5))



print(a.split("\n"))



eg:a = "@明日科技 @扎克伯格 @俞敏洪 @勤奋的天使"



b = a.split(" ") #空格做分隔符



for i in b:



print(i[1:]) #去掉@符号显示



  • 合并字符串:strnew = string.join(iterable) ---join方法



strnew:接收返回的值



string:合并时的分隔符



iterable:可迭代对象(可以是列表,可以是元组)



eg:a = ["明日科技","扎克伯格","俞敏洪","勤奋的天使"]



b = " @".join(a) #用空格和@进行连接



print("@"+b)



五、检索字符串count(),find(),index(),startswith(),endswith()



count():检测字符串出现的次数:str.count(sub[,start[,end]])



str:表示原字符串



sub:表示要检索的子字符串



start:可选参数,表示检索范围的起始位置(不指定,就从头开始)



end:可选参数,表示检索范围的结束为止(不指定,则到结尾)



eg:a = "@明日科技 @扎克伯格 @俞敏洪 @勤奋的天使"



print(a.count("@"))



find():str.find(sub[,start[,end]])



方法用于检索是否包含指定的子字符串,检索字符串不存在,则返回-1,否则返回首次出现的索引值



eg:a = "@明日科技 @扎克伯格 @俞敏洪 @勤奋的天使"



print(a.find("@"))



index():str.index(sub[,start[,end]])



和find方法类似,检索字符串不存在,则返回-1,否则返回首次出现的索引值,只是当index方法检索的字符串不存在时会抛出异常



startswith():str.startswith(sub[,start[,end]])



用于检索字符串是否以指定字符串开头,如果是这返回True,否则返回False



endswith():str.endswith(sub[,start[,end]])



用于检索字符串是否以指定字符串结尾,如果是这返回True,否则返回False



六、字母的大小写转换



  • lower():将字符串中全部大写字母转换为小写字母(如无被转换字符,则返回原值,否则返回新值):str.lower()
  • upper():将字符串的全部小写字母转换为大写字母(如无被转换字符,则返回原值,否则返回新值):str.upper()



eg:username_1 = '|MingRi|mr|mingrisoft|WGH|MRSoft|' # 假设已经注册的会员名称保存在一个字符串中,以|进行分隔



username_2 =username_1.lower() # 将会员名称字符串转换为全部小写



regname_1 = input('输入要注册的会员名称:')



regname_2 = '|' + regname_1.lower() + '|' # 将要注册的会员名称也转换为全部小写



if regname_2 in username_2: # 判断输入的会员名称是否存在



print('会员名',regname_1,'已经存在!')



else:



print('会员名',regname_1,'可以注册!')



七、去除字符串中的空格和特殊字符:(特殊字符指:制表符\t,回车符\r、换行符\n等)



strip():用于去掉字符串左右两侧的空格和和特殊字符串:str.strip([chars])



str:要去除的字符串名



chars:可选参数,用于指定要去除的字符,可以指定多个(不指定时,默认去除空格、制表符、回车符、换行等)



lstript():用于去掉字符串左侧的空格和特殊字符串:str.lstrip([chars])



rstript():用于去掉字符串右侧的空格和特殊字符串:str.rstrip([chars])



八、格式化字符串:



格式化字符串的意思是先指定一个模板,在这个模板中预留几个空位,再根据需要填写相应的内容(这些空位需要通过指定的符号标记(也称占位符),而这些符号还不会显示出来)



  • 使用%操作符(早期版本):定义模板:‘%[-][+][0][m][.n]格式化符号'%exp



  • -:可选参数,用于指定左对齐,正数前方无符号,负数前面加负号
  • +:可选参数,用于指定右对齐,正数前方无符号,负数前面加负号
  • 0:可选参数,表示右对齐,正数前方元符号,负数前面加负号,用0填充空白处(一般与m参数一起使用)
  • m:可选参数,表示占有宽度
  • .n:可选参数,表示小数点后保留的位数
  • exp:要转换的项(如果要指定的项有多个,需要以元组的形式指定)
  • 格式化符号:主要有s、d、c、e、g、b、o、x、f、 %



eg:template = '编号:%09d\t公司名称:%s \t 官网:http://www.%s.com' #定义模板



item = (7,'百度','baidu') #定义要转换的内容



print(template%item)



常用格式化字符:



s:字符串(采用str()显示) c:单个字符



d或者i:十进制整数 x:十六进制整数



f或F:浮点数 r:字符串(采用repr()表示)



o:八进制整数 e:指数(基底写为e)



E:指数(基底写为E) %:字符%



  • 使用format()方法(新版本,常用):str.format(args)



---str用于指定字符串的显示样式(模板),args用于指定要转换的项(有多项时,用“,”隔开)



创建模板:创建模板时,需要使用{}和:指定占位符,基本语法格式如下:



{[index][:[[fill]align][sign][#][width][.precision][type]]}



  • index:可选,指定要设置哥还是的对象在参数列表中的索引位置(从0开始,不指定则根据值得先后顺序自动分配)
  • fill:可选,用于指定空白处填充的字符
  • align:可选,用于指定对其方式(<表示内容左对齐;>表示内容右对齐;=表示内容右对齐,并将符号放在填充内容的最左侧,且只对数字类型有效;值为^表示内容居中,需要配合width使用)
  • sign:可选,用于指定有无符号数(+表示正数加正号,负数加负号;-表示正数不变,负数加负号;值为空格表示正数加空格,负数加负号)
  • #:可选参数,对于耳机子、八进制、十六进制,如果加上#号,表示会显示0b/0o/0x前缀,否则不显示
  • width:可选,指定所占宽度
  • .precision:可选,用于指定保留的小数位数
  • type:可选参数,指定要格式化的数据类型



常用格式化字符:



s:对字符串类型格式化 d:十进制整数



c:将十进制整数自动转换为对应的Unicode字符



e或E:转换为科学计数法表示再格式化



g或G:自动在e和f或E或F中切换



b:将十进制整数自动转换为二进制表示再格式化



o:将十进制整数自动转换为八进制表示在格式化



x或X:将是金子整数自动转换成十六进制表示再格式化



f或F:转换为浮点数(默认小数保留6为)再格式化



%:显示百分比(默认显示小数点后六位)



eg:template = '编号:{:0>9s}\t公司名称:{:s} \t官网:http://www.{:s}.com'



context1 = template.format("7","百度","baidu")



print(context1)



eg:import math #导入数学模块



print("以货币形式显示:¥{:,.2f}元".format(1251+3950)) #以货币形式显示



print("{0:.1f}用科学计数法表示:{0:E}".format(12000.1)) #以科学计数法表示



print("π取5位小数:{:.5f}".format(math.pi)) #输出小数点后5位



print("{0:d}的十六进制是:{0:#x}".format(100)) #十六进制显示



print("天才是有{:.0%}的灵感,加上{:.0%}的汗水。".format(0.01,0.99))










dameon