六、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))

猜你喜欢

转载自www.cnblogs.com/dameon/p/10775900.html