計(jì)算機(jī)經(jīng)常需要對文本進(jìn)行各種操作焰雕,我們知道Python語言表示文本的類型是字符串(str)衷笋,其中可以包含任何字符。系統(tǒng)內(nèi)部以標(biāo)準(zhǔn)的“統(tǒng)一碼”(Unicode)來處理所有字符矩屁,用ord()函數(shù)可以返回一個(gè)字符對應(yīng)的“碼位”辟宗,用chr()函數(shù)則可以返回碼位對應(yīng)的字符爵赵。Unicode碼位的取值范圍是0x0至0x10ffff——這是十六進(jìn)制數(shù),等于十進(jìn)制數(shù)0到1114111泊脐,例如最近加入U(xiǎn)nicode字符集的“顏文字”(Emoji)位于0x1f300~0x1f6ff區(qū)域空幻。
In [1]: ord("A")
Out[1]: 65
In [2]: chr(65)
Out[2]: 'A'
In [3]: ord("一")
Out[3]: 19968
In [4]: chr(19968)
Out[4]: '一'
In [5]: for i in range(0x1f600, 0x1f650): # 基本表情類顏文字
...: print(chr(i), end="")
...: if i % 16 == 15:
...: print()
...:
????????????????????????????????
????????????????????????????????
????????????????????????????????
????????????????????????????????
????????????????????????????????
你還可以在字符串中使用反斜杠打頭的“轉(zhuǎn)義序列”(Escape Sequence)來表示字符,例如反斜杠加n表示換行符容客,而反斜杠加手動(dòng)換行則會(huì)被解釋器完全忽略秕铛。以下是常用的轉(zhuǎn)義序列:
- \換行:忽略
- \\:反斜杠(\)
- \':單引號(')
- \":雙引號(")
- \a:響鈴(BEL)
- \n:換行(LF)
- \r:回車(CR)
- \t:水平制表符(TAB)
- \xhh:十六進(jìn)制數(shù)hh碼位的字符,即擴(kuò)展西文字符(ASCII)
- \uhhhh:十六進(jìn)制數(shù)hhhh碼位的字符缩挑,即基本多語言位面字符(BMP)
- \Uhhhhhhhh:十六進(jìn)制數(shù)hhhhhhhh碼位的字符但两,即任何字符
以下是在交互模式下演示這些轉(zhuǎn)義序列:
In [6]: print("人人為我\
...: 我為人人")
人人為我我為人人
In [7]: print("人人為我\n我為人人")
人人為我
我為人人
In [8]: print("C:\\Windows\\System32") # Windows路徑中的\需要轉(zhuǎn)義
C:\Windows\System32
In [9]: r"C:\Windows\System32" # 加r前綴表示“原始字符串”,解釋器會(huì)自動(dòng)轉(zhuǎn)義
Out[9]: 'C:\\Windows\\System32'
In [10]: print("\x07\u4e00\U0001f600") # 響鈴供置,漢字一镜遣,顏文字笑臉
一??
實(shí)際上反斜杠加手動(dòng)換行也可以在字符串之外使用,當(dāng)某條語句長度超過80字符時(shí)士袄,你可以用這個(gè)方法來分行悲关,以使代碼格式符合PEP8規(guī)范,更為易讀娄柳。
計(jì)算機(jī)在保存和傳輸數(shù)據(jù)時(shí)都是以8個(gè)二進(jìn)制位組成的“字節(jié)”作為基本單位的寓辱,對于文本來說就需要規(guī)定某種字符“編碼”(Encoding),通過只有256個(gè)碼位的字節(jié)序列來表示任何字符赤拒。Python語言的字節(jié)序列類型是加b前綴表示的“字節(jié)串”(bytes)秫筏,其中的元素顯示為基本西文字符或\xhh轉(zhuǎn)義序列。用str.encode()方法可以將str編碼為bytes挎挖,用bytes.decode()方法可以將bytes解碼為str这敬。Python默認(rèn)使用“8位通用轉(zhuǎn)換格式”(UTF-8)進(jìn)行文本編碼和解碼,中文常用的字符編碼格式還有“國標(biāo)碼擴(kuò)展”(GBK)等:
In [11]: "ABC一二三".encode() # 使用默認(rèn)的UTF-8編碼
Out[11]: b'ABC\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89'
In [12]: "ABC一二三".encode("gbk") # 使用GBK編碼
Out[12]: b'ABC\xd2\xbb\xb6\xfe\xc8\xfd'
In [13]: b'ABC\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89'.decode() # 使用默認(rèn)的UTF-8解碼
Out[13]: 'ABC一二三'
In [14]: b'ABC\xd2\xbb\xb6\xfe\xc8\xfd'.decode("gbk") # 使用GBK解碼
Out[14]: 'ABC一二三'
In [15]: len(b'ABC\xd2\xbb\xb6\xfe\xc8\xfd') # 查看字節(jié)串的長度
Out[15]: 9
通過查看字節(jié)串的長度蕉朵,可以看到對于每個(gè)漢字UTF-8使用三字節(jié)編碼崔涂,GBK則使用兩字節(jié)編碼。如果編碼和解碼使用的格式不匹配始衅,就會(huì)出現(xiàn)“亂碼”——請?jiān)L問以下鏈接查看完整的字符編碼列表:https://docs.python.org/3/library/codecs.html#standard-encodings
在不同系統(tǒng)之間傳遞數(shù)據(jù)時(shí)冷蚂,需要先把數(shù)據(jù)對象轉(zhuǎn)化為通用格式再恢復(fù)回來,這個(gè)過程稱為“序列化”(Serialize)和“反序列化”(Unserialize)汛闸。JSON(JavaScript Object Notation)就是一種基于文本的通用數(shù)據(jù)交換格式蝙茶,在互聯(lián)網(wǎng)上應(yīng)用非常廣泛。要在Python中處理JSON诸老,可以引入標(biāo)準(zhǔn)庫的json模塊隆夯。其中dumps()函數(shù)將Python對象序列化為JSON字符串,loads()函數(shù)將JSON字符串反序列化為Python對象:
In [16]: import json
In [17]: dictdata = {"baidu": "百度", "alibaba": "阿里巴巴", "tencent": "騰訊"}
In [18]: jsondata = json.dumps(dictdata, ensure_ascii=False) # ensure_ascii參數(shù)指定非ASCII字符是否要轉(zhuǎn)義
In [19]: jsondata
Out[19]: '{"baidu": "百度", "alibaba": "阿里巴巴", "tencent": "騰訊"}'
In [20]: json.loads(jsondata)
Out[20]: {'baidu': '百度', 'alibaba': '阿里巴巴', 'tencent': '騰訊'}
以下實(shí)例演示了“微歷”天氣API的使用——加參數(shù)訪問網(wǎng)址返回GZIP壓縮的JSON字節(jié)串,經(jīng)過解壓縮蹄衷、解碼和反序列化得到字典對象苞尝,即可輸出其中的天氣預(yù)報(bào)信息:
"""weather.py 獲取天氣預(yù)報(bào)信息
"""
from urllib.request import urlopen
from urllib.parse import quote
import gzip
import json
url = "http://wthrcdn.etouch.cn/weather_mini?city="
city = "拉薩"
def main():
try:
# 發(fā)起網(wǎng)絡(luò)請求獲取數(shù)據(jù)
data = urlopen(url + quote(city)).read()
# 解壓縮并解碼得到JSON格式字符串
data_json = gzip.decompress(data).decode()
# 反序列化為字典對象
data_dict = json.loads(data_json)
if data_dict.get("desc") != "OK":
print("無法獲取天氣數(shù)據(jù)!")
else: # 輸出日期宦芦、天氣、氣溫信息
print("天氣預(yù)報(bào):" + city)
forecast = data_dict.get("data").get("forecast")
for i in forecast:
date = i.get("date")
high = i.get("high")
low = i.get("low")
weather = i.get("type")
print("{} {} {} ~ {}".format(date, weather, low, high))
except Exception as ex:
print(repr(ex))
if __name__ == "__main__":
main()
——編程原來是這樣……
編程小提示:QPython3
如果你想在便攜設(shè)備上使用Python轴脐,可以安裝QPython3這個(gè)App(注意是QPython3调卑,另有一個(gè)QPython是基于Python2的),就能隨時(shí)練習(xí)Python編程了(但不支持tkinter圖形界面工具包)大咱。更多詳情可訪問官方網(wǎng)站 http://www.qpython.org/