天天看點

第二章 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,如需轉載請自行聯系原作者