python中字串:宣告、編碼、函式、格式化
字串的宣告有三種方式:單引號、雙引號和三引號(包括三個單引號或三個雙引號)。例如:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
字串編碼
Python中的字串有兩種資料型別:str型別和unicode型別。str型別採用的ASCII編碼,也就是說它無法表示中文。unicode型別採用unicode編碼,能夠表示任意字元,包括中文及其它語言。並且python中不存在像c語言中的char型別,就算是單個字元也是字串型別。字串預設採用的ASCII編碼,如果要顯示宣告為unicode型別的話,需要在字串前面加上'u'或者'U'。例如:
?1 2 3 4 5 6 |
>>> str1 =
"hello"
>>> print
str1
hello
>>> str2 =
u "中國"
>>> print
str2
中國
|
由於專案中經常出現對字串的操作,而且由於字串編碼問題出現的問題很多,下面,來說一下關於字串的編碼問題。在與python打交道的過程中經常會碰到ASCII、Unicode和UTF-8三種編碼。具體的介紹請參見這篇文章。我簡單的理解就是,ASCII編碼適用英文字元,Unicode適用於非英文字元(例如中文、韓文等),而utf-8則是一種儲存和傳送的格式,是對Unicode字元的再編碼(以8位為單位編碼)。例如:
1 2 3 4 5 6 |
u =
u '漢'
print repr (u)
# u'\u6c49'
s =
u.encode( 'UTF-8' )
print repr (s)
# '\xe6\xb1\x89'
u2 =
s.decode( 'UTF-8' )
print repr (u2)
# u'\u6c49'
|
解釋:宣告unicode字串”漢“,它的unicode編碼為”\u6c49“,經過utf-8編碼轉換後,它的編碼變成”\xe6\xb1\x89“。
對於編碼的經驗總結:
1.在python檔案頭宣告編碼格式 ;
#-*- coding: utf-8 -*-
2.將字串統一宣告為unicode型別,即在字串前加u或者U;
3.對於檔案讀寫的操作,建議適用codecs.open()代替內建的open(),遵循一個原則,用哪種格式寫,就用哪種格式讀;
假設在一個以ANSI格式儲存的文字檔案中有“中國漢字”幾個字,如果直接用以下程式碼,並且要在GUI上或者在一個IDE中打印出來(例如在sublime text中,或者在pydev中列印),就會出現亂碼或者異常,因為codecs會依據文字本身的編碼格式讀取內容:
1 2 3 4 |
f =
codecs. open ( "d:/test.txt" )
content =
f.read()
f.close()
print content
|
改用如下方法即可(只對中文起作用):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# -*- coding: utf-8 -*-
import codecs
f =
codecs. open ( "d:/test.txt" )
content =
f.read()
f.close()
if isinstance (content, unicode ):
print content.encode( 'utf-8' )
print "utf-8"
else :
print content.decode( 'gbk' ).encode( 'utf-8' )
|
字串內建函式
字串提供了許多內建的函式,這些在很多Python程式中很有用處,它們包括:
- endswith() - 檢查字串是否以給定字串結尾
- startswith() - 檢查字串是否以給定字串開始
- upper() - 將字串所有字元變成大寫
- lower() - 將字串所有字元變成小寫
- isupper()/islower() - 檢測字串是否全是大寫/小寫
- len() -字串長度
如下表所示列出了目前字串內建支援的方法,所有的方法都包含了對Unicode的支援,有一些甚至是專門用於Unicode的。
方法 | 描述 |
---|---|
返回一個原字串居中,並使用空格填充至長度 width 的新字串 |
|
以 encoding 指定的編碼格式解碼 string,如果出錯預設報一個 ValueError 的 異 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace' |
|
以 encoding 指定的編碼格式編碼 string,如果出錯預設報一個ValueError 的異常,除非 errors 指定的是'ignore'或者'replace' |
|
檢查字串是否以 obj 結束,如果beg 或者 end 指定則檢查指定的範圍內是否以 obj 結束,如果是,返回 True,否則返回 False. |
|
檢測 str 是否包含在 string 中,如果 beg 和 end 指定範圍,則檢查是否包含在指定範圍內,如果是返回開始的索引值,否則返回-1 |
|
如果 string 至少有一個字元並且所有字元都是字母或數字則返 回 True,否則返回 False |
|
如果 string 至少有一個字元並且所有字元都是字母則返回 True, 否則返回 False |
|
如果 string 只包含十進位制數字則返回 True 否則返回 False. |
|
如果 string 只包含數字則返回 True 否則返回 False. |
|
如果 string 中包含至少一個區分大小寫的字元,並且所有這些(區分大小寫的)字元都是小寫,則返回 True,否則返回 False |
|
如果 string 中只包含數字字元,則返回 True,否則返回 False |
|
如果 string 中只包含空格,則返回 True,否則返回 False. |
|
如果 string 是標題化的(見 title())則返回 True,否則返回 False |
|
如果 string 中包含至少一個區分大小寫的字元,並且所有這些(區分大小寫的)字元都是大寫,則返回 True,否則返回 False |
|
以 string 作為分隔符,將 seq 中所有的元素(的字串表示)合併為一個新的字串 |
|
返回一個原字串左對齊,並使用空格填充至長度 width 的新字串 |
|
maketrans() 方法用於建立字元對映的轉換表,對於接受兩個引數的最簡單的呼叫方式,第一個引數是字串,表示需要轉換的字元,第二個引數也是字串表示轉換的目標。 |
|
返回字串 str 中最大的字母。 |
|
返回字串 str 中最小的字母。 |
|
有點像 find()和 split()的結合體,從 str 出現的第一個位置起,把 字 符 串 string 分 成 一 個 3 元 素 的 元 組 (string_pre_str,str,string_post_str),如果 string 中不包含str 則 string_pre_str == string. |
|
返回一個原字串右對齊,並使用空格填充至長度 width 的新字串 |
|
string.rpartition(str) |
類似於 partition()函式,不過是從右邊開始查詢. |
返回"標題化"的 string,就是說所有單詞都是以大寫開始,其餘字母均為小寫(見 istitle()) |
|
根據 str 給出的表(包含 256 個字元)轉換 string 的字元, 要過濾掉的字元放到 del 引數中 |
|
返回長度為 width 的字串,原字串 string 右對齊,前面填充0 |
|
isdecimal()方法檢查字串是否只包含十進位制字元。這種方法只存在於unicode物件。 |
字串格式化(一)
最好的方法是用 format
語句來完成,這個函式為你處理你傳入物件的型別以字串形式顯示,所以你可以傳入任何型別的物件到 format
方法用來輸出。如下:
>>> string_1 = "Hello, {}, here is your string".format("David")
'Hello, David, here is your string'
>>>
>>> string_2 = "Hello, {}, your are {} years old".format("David", 23)
'Hello, David, you are 23 years old'
>>>
>>> string_3 = "Hello, {}, your are {} years old".format("David", 23.5)
'Hello, David, you are 23.5 years old'
從上面的程式碼可以清晰地看出,format
方法可以用來將任意的
Python 資料型別替換成字串。
字串格式化(二)
Python 支援格式化字串的輸出 。儘管這樣可能會用到非常複雜的表示式,但最基本的用法是將一個值插入到一個有字串格式符 %s 的字串中。
在 Python 中,字串格式化使用與 C 中 sprintf 函式一樣的語法。
如下例項:
#!/usr/bin/pythonprint"My name is %s and weight is %d kg!"%('Zara',21)
以上例項輸出結果:
My name isZaraand weight is21 kg!
python字串格式化符號:
符 號 | 描述 |
---|---|
%c | 格式化字元及其ASCII碼 |
%s | 格式化字串 |
%d | 格式化整數 |
%u | 格式化無符號整型 |
%o | 格式化無符號八進位制數 |
%x | 格式化無符號十六進位制數 |
%X | 格式化無符號十六進位制數(大寫) |
%f | 格式化浮點數字,可指定小數點後的精度 |
%e | 用科學計數法格式化浮點數 |
%E | 作用同%e,用科學計數法格式化浮點數 |
%g | %f和%e的簡寫 |
%G | %f 和 %E 的簡寫 |
%p | 用十六進位制數格式化變數的地址 |
格式化操作符輔助指令:
符號 | 功能 |
---|---|
* | 定義寬度或者小數點精度 |
- | 用做左對齊 |
+ | 在正數前面顯示加號( + ) |
<sp> | 在正數前面顯示空格 |
# | 在八進位制數前面顯示零('0'),在十六進位制前面顯示'0x'或者'0X'(取決於用的是'x'還是'X') |
0 | 顯示的數字前面填充'0'而不是預設的空格 |
% | '%%'輸出一個單一的'%' |
(var) | 對映變數(字典引數) |
m.n. | m 是顯示的最小總寬度,n 是小數點後的位數(如果可用的話) |