2.1 字符串
2.1.1 字符串转换
1
2
3
4
5
6
7
8
9
10
<code>>>> a </code><code>=</code> <code>123</code>
<code>>>> b </code><code>=</code> <code>1.23</code>
<code>>>> </code><code>type</code><code>(a)</code>
<code><</code><code>type</code> <code>'int'</code><code>></code>
<code>>>> </code><code>type</code><code>(b)</code>
<code><</code><code>type</code> <code>'float'</code><code>></code>
<code>>>> </code><code>type</code><code>(</code><code>str</code><code>(a))</code>
<code><</code><code>type</code> <code>'str'</code><code>></code>
<code>>>> </code><code>type</code><code>(</code><code>str</code><code>(b))</code>
说明:先定义个整数和浮点数,再查看类型,用str()函数将对象转成字符串。
这里的用到了type()函数,用于查看对象类型。这个type()在以后学习中很用的,刚开始学习时候,往往因为对象类型不对,导致程序运行报错,这时可以用它来排查问题。
2.1.2 字符串连接
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<code># 加号字符将同类型字符连接到一起 </code>
<code>>>> hw </code><code>=</code> <code>"Hello"</code> <code>+</code> <code>"World!"</code>
<code>>>> </code><code>print</code> <code>hw</code>
<code>HelloWorld!</code>
<code># 两个相邻的字符串自动连接一起</code>
<code>>>> hw </code><code>=</code> <code>"Hello"</code><code>"World!"</code>
<code># 如果字符串内包括单引号或双引号,要用\转义,否则报错,上一章也讲过。</code>
<code>>>> hw </code><code>=</code> <code>"Hello \"World!\""</code>
<code>Hello </code><code>"World!"</code>
<code># 不同字符串类型拼接</code>
<code>>>> a </code><code>=</code> <code>"abc"</code>
<code>>>> b </code><code>=</code> <code>1</code>
<code>>>> </code><code>print</code> <code>a </code><code>+</code> <code>b</code>
<code>Traceback (most recent call last):</code>
<code> </code><code>File</code> <code>"<stdin>"</code><code>, line </code><code>1</code><code>, </code><code>in</code> <code><module></code>
<code>TypeError: cannot concatenate </code><code>'str'</code> <code>and</code> <code>'int'</code> <code>objects</code>
<code>说明:不同字符串类型不允许连接,想要连接可以下面这么做。</code>
<code>方法</code><code>1</code><code>:</code>
<code>>>> c </code><code>=</code> <code>"%s%d"</code> <code>%</code><code>(a,b)</code>
<code>>>> </code><code>print</code> <code>c</code>
<code>abc1</code>
<code>方法</code><code>2</code><code>:</code>
<code>>>> c </code><code>=</code> <code>a </code><code>+</code> <code>str</code><code>(b)</code>
2.1.3 格式化输出
操作符号
说明
%s
字符串(str())
%r
字符串(repr())
%d
整数
%f
浮点数,可指定小数点后的精度
1) 字符串格式输出三种方法
<code>>>> xxoo </code><code>=</code> <code>"string"</code>
<code>>>> </code><code>print</code> <code>"%s"</code> <code>%</code><code>xxoo</code>
<code>string</code>
<code>>>> </code><code>print</code> <code>"%r"</code> <code>%</code><code>xxoo</code>
<code>'string'</code>
<code>>>> </code><code>print</code> <code>`xxoo` </code>
说明:%s采用str()函数显示,%r采用repr()函数显示。repr()和反撇号把字符串转为Python表达式。
2) 保留小数点数
<code>>>> </code><code>'%.1f'</code> <code>%</code><code>(</code><code>float</code><code>(</code><code>100</code><code>)</code><code>/</code><code>1024</code><code>) </code>
<code>'0.1'</code>
2.1.4 字符串处理
上图是字符串处理的方法,红色框框中大概有一半经常用的,我们就拿一部分常用的来举例说明。
29
30
31
32
33
34
35
36
37
38
39
40
41
<code>#!/usr/bin/env python </code>
<code># -*- coding: utf-8 -*-</code>
<code>xxoo </code><code>=</code> <code>"Hello world!"</code>
<code>print</code> <code>"字符串长度: %s"</code> <code>%</code> <code>len</code><code>(xxoo)</code>
<code>print</code> <code>"首字母大写: %s"</code> <code>%</code> <code>xxoo.capitalize()</code>
<code>print</code> <code>"字符l出现次数: %s"</code> <code>%</code> <code>xxoo.count(</code><code>'l'</code><code>)</code>
<code>print</code> <code>"感叹号是否结尾: %s"</code> <code>%</code> <code>xxoo.endswith(</code><code>'!'</code><code>)</code>
<code>print</code> <code>"w字符是否是开头: %s"</code> <code>%</code> <code>xxoo.startswith(</code><code>'w'</code><code>)</code>
<code>print</code> <code>"w字符索引位置: %s"</code> <code>%</code> <code>xxoo.find(</code><code>'w'</code><code>) </code><code># xxoo.index('W')</code>
<code>print</code> <code>"格式化字符串: Hello{0} world!"</code><code>.</code><code>format</code><code>(</code><code>','</code><code>)</code>
<code>print</code> <code>"是否都是小写: %s"</code> <code>%</code> <code>xxoo.islower()</code>
<code>print</code> <code>"是否都是大写: %s"</code> <code>%</code> <code>xxoo.isupper()</code>
<code>print</code> <code>"所有字母转为小写: %s"</code> <code>%</code> <code>xxoo.lower()</code>
<code>print</code> <code>"所有字母转为大写: %s"</code> <code>%</code> <code>xxoo.upper()</code>
<code>print</code> <code>"感叹号替换为句号: %s"</code> <code>%</code> <code>xxoo.replace(</code><code>'!'</code><code>,</code><code>'.'</code><code>)</code>
<code>print</code> <code>"以空格分隔切分成列表: %s"</code> <code>%</code> <code>xxoo.split(</code><code>' '</code><code>)</code>
<code>print</code> <code>"转换为一个列表: %s"</code> <code>%</code> <code>xxoo.splitlines()</code>
<code>print</code> <code>"去除两边空格: %s"</code> <code>%</code> <code>xxoo.strip()</code>
<code>print</code> <code>"大小写互换: %s"</code> <code>%</code> <code>xxoo.swapcase()</code>
<code>print</code> <code>"只要Hello字符串: %s"</code> <code>%</code> <code>xxoo[</code><code>0</code><code>:</code><code>5</code><code>]</code>
<code>print</code> <code>"去掉倒数第一个字符: %s"</code> <code>%</code> <code>xxoo[</code><code>0</code><code>:</code><code>-</code><code>1</code><code>]</code>
<code> </code>
<code># python test.py</code>
<code>字符串长度: </code><code>12</code>
<code>首字母大写: Hello world!</code>
<code>字符l出现次数: </code><code>3</code>
<code>感叹号是否结尾: </code><code>True</code>
<code>w字符是否是开头: </code><code>False</code>
<code>w字符索引位置: </code><code>6</code>
<code>格式化字符串: Hello, world!</code>
<code>是否都是小写: </code><code>False</code>
<code>是否都是大写: </code><code>False</code>
<code>所有字母转为小写: hello world!</code>
<code>所有字母转为大写: HELLO WORLD!</code>
<code>感叹号替换为句号: Hello world.</code>
<code>以空格分隔切分成列表: [</code><code>'Hello'</code><code>, </code><code>'world!'</code><code>]</code>
<code>转换为一个列表: [</code><code>'Hello world!'</code><code>]</code>
<code>去除两边空格: Hello world!</code>
<code>大小写互换: hELLO WORLD!</code>
<code>只要Hello字符串: Hello</code>
<code>去掉倒数第一个字符: Hello world</code>
2.1.5 字符串输出颜色
字体颜色
字体背景颜色
显示方式
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
0:终端默认设置
1:高亮显示
4:下划线
5:闪烁
7:反白显示
8:隐藏
格式:
\033[1;31;40m # 1是显示方式,可选。31是字体颜色。40m是字体背景颜色。
\033[0m # 恢复终端默认颜色,即取消颜色设置。
<a href="http://s4.51cto.com/wyfs02/M02/87/60/wKioL1fenUOAvFGqAAC3Uy3FuZk327.png" target="_blank"></a>
<a href="http://s2.51cto.com/wyfs02/M01/87/63/wKiom1fenVng_T7yAACUWawoUEc068.png" target="_blank"></a>
博客地址:http://lizhenliang.blog.51cto.com
QQ群:Shell/Python运维开发群 323779636
2.2 编码
2.2.1 常见字符编码类型
ASCII:美国信息交换标准码,是目前计算机中最广泛使用的字符集编码。每个ASCII码以1个字节存储,例如数字字符0的ASCII码是0110000,十进制表示为48。
Unicode:为解决世界上上百种语言带来混合、冲突,各国有各国的标准,显示很容易出现乱码。Unicode就出现了,它把所有语言的字符都统一到一套Unicode编码中,并定义每个语言字符的标准,所以Unicode又称统一码,万国码。大部分编程语言都支持Unicode,Python内部编码也支持Unicode。
GB2312:中国国家标准总局发布处理汉字的标准编码。
GBK:GB2312的扩展,向下兼容GB2312。
UTF-8:针对Unicode的可变长度字符编码,又称万国码。支持中文简体繁体及其它语言(如英文,日文,韩文)。
2.2.3 decode()
decode()函数作用是将其他编码(比如ACSII、Byte String)的字符串解码成Unicode。
2.2.4 encode()
encode()函数作用是将Unicode编码成终端软件能是识别的编码,就能正常显示了,比如UTF-8、GBK。
2.2.5 Python编码处理
<code>#!/usr/bin/env python </code>
<code>c </code><code>=</code> <code>"中文"</code>
<code>print</code> <code>c</code>
<code> </code>
<code> </code><code>File</code> <code>"test.py"</code><code>, line </code><code>2</code>
<code>SyntaxError: Non</code><code>-</code><code>ASCII character </code><code>'\xe4'</code> <code>in</code> <code>file</code> <code>test.py on line </code><code>3</code><code>, but no encoding declared; see http:</code><code>/</code><code>/</code><code>www.python.org</code><code>/</code><code>peps</code><code>/</code><code>pep</code><code>-</code><code>0263.html</code> <code>for</code> <code>details</code>
说明:在程序里面直接打印中文,会报语法错误,这是因为Python默认编码是ASCII,无法处理其他编码。
如果想打印中文,需要声明编码为utf-8,上面也有写过:
<code>c = </code><code>"中文"</code>
<code>print c</code>
<code>print </code><code>type</code><code>(c)</code>
<code>中文</code>
可以正常输出中文了,类型是字符串,这个字符串是经过Python unicode编码后字节组成的。
虽然可以正常输入中文,并不意味的就万事大吉了,如果终端编码不是utf-8或其他软件也不确定编码还会出现乱码情况。所以还是要明白Python处理编码逻辑关系,才能更好的应对编码问题。
切换到交互式解释器:
<code>>>> c </code><code>=</code> <code>"中文"</code>
<code>>>> c.encode(</code><code>'utf-8'</code><code>)</code>
<code>UnicodeDecodeError: </code><code>'ascii'</code> <code>codec can't decode byte </code><code>0xe4</code> <code>in</code> <code>position </code><code>0</code><code>: ordinal </code><code>not</code> <code>in</code> <code>range</code><code>(</code><code>128</code><code>)</code>
如果直接转成utf-8是不允许的,报错Unicode解码错误,大概意思是说ascii码不能解码字节字符串。
上面讲到encode()函数作用是将Unicode码解码,而现在的c变量并非是Unicode码,而是字节字符串,算是Unicode的一种吧?。
故此,不能使用encode(),而是先使用decode()先解码陈Unicode再用encode()编码成utf-8。
<code>>>> c.decode(</code><code>'utf-8'</code><code>) </code>
<code>u</code><code>'\u4e2d\u6587'</code> <code># 4e2d对应unicode值是"中",6587对应unicdoe值是"文"</code>
<code>>>> </code><code>type</code><code>(c.decode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code><</code><code>type</code> <code>'unicode'</code><code>></code>
<code>>>> </code><code>print</code> <code>c.decode(</code><code>'utf-8'</code><code>) ?</code>
<code>>>> </code><code>print</code> <code>c.decode(</code><code>'utf-8'</code><code>).encode(</code><code>'utf-8'</code><code>)</code>
如果是Unicode字符串可直接通过encode()函数转码其他编码。
<code>>>> c </code><code>=</code> <code>u</code><code>'中文'</code>
<code>'\xe4\xb8\xad\xe6\x96\x87'</code>
<code>>>> </code><code>print</code> <code>c.encode(</code><code>'utf-8'</code><code>)</code>
看下字节字符串和unicode字符串区别:
<code>>>> c </code><code>=</code> <code>'中文'</code>
<code>>>> u </code><code>=</code> <code>u</code><code>'中文'</code>
<code>>>> c</code>
<code>>>> u</code>
<code>u</code><code>'\u4e2d\u6587'</code>
<code>>>> </code><code>len</code><code>(c)</code>
<code>6</code>
<code>>>> </code><code>len</code><code>(u)</code>
<code>2</code>
字节字符串长度要比unicode长的多,而unicode长度就是字符长度。
总结下:Python处理编码流程大致是这样的,ascii --> decode() --> unicode --> encode() --> 终端能识别的编码,unicode算是一个中间码,有着承上启下的作用。
本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1851539,如需转载请自行联系原作者