天天看点

第二章 Python字符串处理和编码不再发愁

2.1 字符串

2.1.1 字符串转换

1

2

3

4

5

6

7

8

9

10

<code>&gt;&gt;&gt; a </code><code>=</code> <code>123</code>    

<code>&gt;&gt;&gt; b </code><code>=</code> <code>1.23</code>

<code>&gt;&gt;&gt; </code><code>type</code><code>(a)</code>

<code>&lt;</code><code>type</code> <code>'int'</code><code>&gt;</code>

<code>&gt;&gt;&gt; </code><code>type</code><code>(b)</code>

<code>&lt;</code><code>type</code> <code>'float'</code><code>&gt;</code>

<code>&gt;&gt;&gt; </code><code>type</code><code>(</code><code>str</code><code>(a))</code>

<code>&lt;</code><code>type</code> <code>'str'</code><code>&gt;</code>

<code>&gt;&gt;&gt; </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>&gt;&gt;&gt; hw </code><code>=</code> <code>"Hello"</code> <code>+</code> <code>"World!"</code>

<code>&gt;&gt;&gt; </code><code>print</code> <code>hw</code>

<code>HelloWorld!</code>

<code># 两个相邻的字符串自动连接一起</code>

<code>&gt;&gt;&gt; hw </code><code>=</code> <code>"Hello"</code><code>"World!"</code>

<code># 如果字符串内包括单引号或双引号,要用\转义,否则报错,上一章也讲过。</code>

<code>&gt;&gt;&gt; hw </code><code>=</code> <code>"Hello \"World!\""</code>

<code>Hello </code><code>"World!"</code>

<code># 不同字符串类型拼接</code>

<code>&gt;&gt;&gt; a </code><code>=</code> <code>"abc"</code>

<code>&gt;&gt;&gt; b </code><code>=</code> <code>1</code>

<code>&gt;&gt;&gt; </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>"&lt;stdin&gt;"</code><code>, line </code><code>1</code><code>, </code><code>in</code> <code>&lt;module&gt;</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>&gt;&gt;&gt; c </code><code>=</code> <code>"%s%d"</code> <code>%</code><code>(a,b)</code>

<code>&gt;&gt;&gt; </code><code>print</code> <code>c</code>

<code>abc1</code>

<code>方法</code><code>2</code><code>:</code>

<code>&gt;&gt;&gt; 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>&gt;&gt;&gt; xxoo </code><code>=</code> <code>"string"</code>    

<code>&gt;&gt;&gt; </code><code>print</code> <code>"%s"</code> <code>%</code><code>xxoo</code>

<code>string</code>

<code>&gt;&gt;&gt; </code><code>print</code> <code>"%r"</code> <code>%</code><code>xxoo</code>

<code>'string'</code>

<code>&gt;&gt;&gt; </code><code>print</code> <code>`xxoo`   </code>

说明:%s采用str()函数显示,%r采用repr()函数显示。repr()和反撇号把字符串转为Python表达式。

2) 保留小数点数

<code>&gt;&gt;&gt; </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>&gt;&gt;&gt; c </code><code>=</code> <code>"中文"</code>        

<code>&gt;&gt;&gt; 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>&gt;&gt;&gt; c.decode(</code><code>'utf-8'</code><code>)        </code>

<code>u</code><code>'\u4e2d\u6587'</code>       <code># 4e2d对应unicode值是"中",6587对应unicdoe值是"文"</code>

<code>&gt;&gt;&gt; </code><code>type</code><code>(c.decode(</code><code>'utf-8'</code><code>))</code>

<code> </code><code>&lt;</code><code>type</code> <code>'unicode'</code><code>&gt;</code>

<code>&gt;&gt;&gt; </code><code>print</code> <code>c.decode(</code><code>'utf-8'</code><code>)    ?</code>

<code>&gt;&gt;&gt; </code><code>print</code> <code>c.decode(</code><code>'utf-8'</code><code>).encode(</code><code>'utf-8'</code><code>)</code>

如果是Unicode字符串可直接通过encode()函数转码其他编码。

<code>&gt;&gt;&gt; c </code><code>=</code> <code>u</code><code>'中文'</code>    

<code>'\xe4\xb8\xad\xe6\x96\x87'</code>

<code>&gt;&gt;&gt; </code><code>print</code> <code>c.encode(</code><code>'utf-8'</code><code>)</code>

看下字节字符串和unicode字符串区别:

<code>&gt;&gt;&gt; c </code><code>=</code> <code>'中文'</code>        

<code>&gt;&gt;&gt; u </code><code>=</code> <code>u</code><code>'中文'</code>

<code>&gt;&gt;&gt; c</code>

<code>&gt;&gt;&gt; u</code>

<code>u</code><code>'\u4e2d\u6587'</code>

<code>&gt;&gt;&gt; </code><code>len</code><code>(c)</code>

<code>6</code>

<code>&gt;&gt;&gt; </code><code>len</code><code>(u)</code>

<code>2</code>

字节字符串长度要比unicode长的多,而unicode长度就是字符长度。

总结下:Python处理编码流程大致是这样的,ascii --&gt; decode() --&gt; unicode --&gt; encode() --&gt; 终端能识别的编码,unicode算是一个中间码,有着承上启下的作用。

本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1851539,如需转载请自行联系原作者