【python】-- 字符串、字符编码与转码
字符串
字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。
创建字符串很简单,只要为变量分配一个值即可;访问子字符串,可以使用方括号来截取字符串:
1 var1 = 'Hello World!' 2 var2 = "Runoob" 3 4 print ("var1[0]: ", var1[0]) 5 print ("var2[1:5]: ", var2[1:5])
1、字符串运算符
变量a值为字符串 "Hello",b变量值为 "Python":
2、字符串格式化
print ("我叫 %s 今年 %d 岁!" % ('小明', 10)) #我叫 小明 今年 10 岁!
字符串格式化符号
3、字符串内置方法:
capitalize() 将首字母大写 >>> name = "qigao zhang" >>> name.capitalize() 'Qigao zhang' #------------------------------------------------------------- count(sub,start=None,end=None) 统计 sub:统计的字符,start:开始位,end:结束位,start和end默认为空时,则表示全部字符中去统计 >>> name = "qigao zhangz" #有开始和结束符 >>> name.count("z",1,5) 0 #从整个字符串中统计字符 >>> name.count("z") 2 #----------------------------------------------------- center(width,fillchar) 如果width(字符宽度)小于等于(<=)字符串的长度,则返回原字符串,如果大于(>)字符串的,则用fillchar(填满字符)填满,处理结果等于width,字符串位于fillchar的中间 >>> name = "qigao zhangz" >>> len(name) 12 #10小于等于字符串宽度 >>> name.center(10,'-') 'qigao zhangz' #51大于字符串长度,并且字符串位于填充字符的中间 >>> name.center(51,'-') '--------------------qigao zhangz-------------------' >>> len(name.center(51,'-')) 51 #----------------------------------------------------- ljust(width,fillchar) 如果字符串的长度大于width(字符宽度),则返回原字符串,如果小于width,则用fillchar(填满字符)填满,处理结果等于width,fillchar位于字符串的最右边 >>> name = "qigao zhang" >>> len(name) 11 #小于等于字符串的长度 >>> name.ljust(11,'-') 'qigao zhang' #大于字符串的长度 >>> name.ljust(50,'-') 'qigao zhang---------------------------------------' >>> len(name.ljust(50,'-')) 50 注:ljust中的l表示left的意思,表示从右向左 #----------------------------------------------------- rjust(width,fillchar) 如果字符串的长度大于width(字符宽度),则返回原字符串,如果小于width,则用fillchar(填满字符)填满,处理结果等于width,fillchar位于字符串的最左边 >>> name = "qigao zhang" >>> len(name) 11 >>> name.rjust(11,'-') 'qigao zhang' >>> name.rjust(50,'-') '---------------------------------------qigao zhang' >>> len(name.rjust(50,'-')) 50 注:ljust中的l表示left的意思,表示从左向右 #----------------------------------------------------- 编码(encode) 字符串的编码和解码 str = "python"; str_utf8 = str.encode("UTF-8") str_gbk = str.encode("GBK") print(str) print("UTF-8 编码:", str_utf8) print("GBK 编码:", str_gbk) print("UTF-8 解码:", str_utf8.decode('UTF-8','strict')) print("GBK 解码:", str_gbk.decode('GBK','strict')) #----------------------------------------------------- endwith(suffix,start=None,end=None) 判断是否已suffix结尾,是返回True,否返回Fales suffix:表示字符,start:开始位,end:结束位,start和end默认为空是,表示从整个字符串的结尾去判断 >>> name = "qigao zhang" #start和end不为空 >>> name.endswith('g',1,5) False #默认为空 >>> name.endswith('g') True #----------------------------------------------------- find(sub,start=None,end=None) 全文查找sub中第一个字符所在整个字符串中的索引值,没有找到则返回-1 sub:字符或者字符串,start:开始位,end:结束位,start和end默认为空时,则在整个字符串中查找 >>> name = "qigao zhang" #没找到,则返回-1 >>> name.find('zh',1,5) -1 >>> name.find('q',2) -1 >>> name.find('zh') 6 >>> name.find('zh',1,8) 6 #----------------------------------------------------- rfind(sub,start=None,end=None) 从左向右查找sub中第一个字符所在整个字符串中的索引值,没有找到则返回-1 >>> name = "qigao zhang" #找到 >>> name.rfind('q') 0 #未找到 >>> name.rfind('q',2) -1 #----------------------------------------------------- 12、format() 指定方式格式化 #----------------------------------------------------- format_map() 数据格式,以字典形式传入 >>> name = "name:{name},age:{age}" >>> name.format_map({'name':'zhangqigao','age':23}) #输出结果 'name:zhangqigao,age:23' #----------------------------------------------------- isalnum() 是否是一个阿拉伯数字和字母,它包含因为英文字符+(1-9)数字,中间不能有特殊字符 >>> age = '23' >>> age.isalnum() True #有特殊字符的 >>> age = '2.3' >>> age.isalnum() False >>> age = 'ab23' >>> age.isalnum() True >>> age = 'ab' >>> age.isalnum() True #----------------------------------------------------- isalpha() 是否是一个纯的英文字符,包含大写 >>> age = 'ab' >>> age.isalpha() True #夹着数字 >>> age = 'ab23' >>> age.isalpha() False #大写 >>> age = 'Ab' >>> age.isalpha() True #----------------------------------------------------- isdigit() 判断是否是一个整数 #----------------------------------------------------- isspace() 判断是否是一个空格 #不是空格 >>> age = ' age' >>> age.isspace() False #是空格 >>> age = ' ' >>> age.isspace() True #----------------------------------------------------- istitle() 是否是一个标题(字符串中的每个单子首字母大写) #每个单词的首字母是大写 >>> name = "Zhang Qi Gao" >>> name.istitle() True #每个单词的首字母是小写 >>> name = "zhang qi gao" >>> name.istitle() False #----------------------------------------------------- isupper() 是否是大写,注意字符串必须全部是大写才会返回True,否则返回False #全部大写 >>> name="ZHANG" >>> name.isupper() True #小写 >>> name="Zhang" >>> name.isupper() False #----------------------------------------------------- join() 序列用某个字符拼接成一个字符串,注意的是,序列的元素必须是str类型 >>> a = ['1','2','3'] >>> '+'.join(a) '1+2+3' #----------------------------------------------------- lower() 字符串中的大写字母转换为小写字母 >>> name = "ZhangQiGao" >>> name.lower() 'zhangqigao' #----------------------------------------------------- upper() 字符串中的小写字母转换为大写字母 >>> name = "ZhangQiGao" >>> name.upper() 'ZHANGQIGAO' #----------------------------------------------------- strip() 去掉左右两边的空格(space)和回车(\n) >>> name = " \n zhangqigao \n" >>> name.strip() 'zhangqigao' #----------------------------------------------------- lstrip() 删掉左边到右的空格(space)和回车(\n) >>> name = " \n zhangqigao \n" >>> name.lstrip() 'zhangqigao \n' #----------------------------------------------------- rstrip() 删掉右边到左边的空格(space)和回车(\n) >>> name = " \n zhangqigao \n" >>> name.rstrip() ' \n zhangqigao' 至此,方法前有l(left)和r(right)的函数,都是对之前函数的一个扩展,带l的表示至始至终从右到左操作,记住左边才是最终目的地,而带r的至始至终都是从左到右,因为右边才是它的终极目标 #----------------------------------------------------- split() 分割函数,默认是以空格分割(space)生成一个列表,如果其他字符分割,输入其他字符参数 >>> name = "qigao zhang" #默认为空,按空格分割 >>> name.split() ['qigao', 'zhang'] >>> name = "qigao+zhang" #以'+'字符分割 >>> name.split("+") ['qigao', 'zhang'] #以'\n'分割 >>> name = "qigao\nzhang" >>> name.split("\n") ['qigao', 'zhang'] #----------------------------------------------------- splitlines() 以换行符分割,这个一般在windows上开发,移到Linux上执行,或者在Linux上开发,移到Windows上执行,因为换行在windows上是"\r\n",linux上是'\n' >>> name = "qigao\nzhang" >>> name.splitlines() ['qigao', 'zhang'] #----------------------------------------------------- swapcase() 把大写换成小写,把小写换成大写 >>> name = "ZHang" >>> name.swapcase() 'zhANG' #----------------------------------------------------- startswith(prefix, start=None,end=None) 判断是否已prefix结尾,是返回True,否返回Fales prefix:表示字符或者字符或者字符串,start:开始位,end:结束位,start和end默认为空是,表示从整个字符串的结尾去判断 >>> name = "zhang qigao" >>> name.startswith("zhang") #开头找到"zhang" 字符串 True >>> name.startswith("h",3,5) #在索引3到5之间没有找到以字符'h'开头 False #----------------------------------------------------- replace(old,new[, max]) old:将被替换的子字符串; new:新字符串,用于替换old子字符串;max:可选字符串, 替换不超过 max 次 >>> name = "zhang is shuai ge" >>> name.replace('is','was') 'zhang was shuai ge' #原字符串没有改变 >>> name 'zhang is shuai ge' >>> name.replace('is','was',0) 'zhang is shuai ge' >>> name.replace('is','was',1) 'zhang was shuai ge' #----------------------------------------------------- zfill(width) 字符的长度是否大于等于(>=)with,如果比width小,则在字符串钱用0填充,如果>=width,则返回原字符串 >>> name = "zhangqigao" >>> len(name) 10 #width大于字符串长度 >>> name.zfill(11) '0zhangqigao' #width小于等于字符串长度 >>> name.zfill(10) 'zhangqigao'
format()
字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序 'hello world' >>> "{0} {1}".format("hello", "world") # 设置指定位置 'hello world' >>> "{1} {0} {1}".format("hello", "world") # 设置指定位置 'world hello world'
也可以设置参数:
print("网站名:{name}, 地址 {url}".format(name="QQ", url="www.QQ.com")) # 通过字典设置参数 site = {"name": "QQ", "url": "www.QQ.com"} print("网站名:{name}, 地址 {url}".format(**site)) # 通过列表索引设置参数 my_list = ['QQ', 'www.QQ.com'] print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是可选的
数字格式化:
str.format() 格式化数字的多种方法
>>> print("{:.2f}".format(3.1415926)); 3.14
字符编码与转码
总结:
1.在python2默认编码是ASCII, python3里默认是unicode
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
详细文章:
http://www.cnblogs.com/yuanchenqi/articles/5956943.html