日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python序列符号_Python中的文本和字节序列

發(fā)布時間:2024/7/5 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python序列符号_Python中的文本和字节序列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之?dāng)?shù)據(jù)結(jié)構(gòu)篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。

本章重點:

1、了解字符字節(jié)等概念,編解碼問題;

2、熟悉字符的規(guī)范化處理和雙模式API。

一、基本概念

Unicode

Unicode(統(tǒng)一碼、萬國碼、單一碼)是計算機(jī)科學(xué)領(lǐng)域里的一項業(yè)界標(biāo)準(zhǔn),包括字符集、編碼方案等。Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的,它為每種語言中的每個字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語言、跨平臺進(jìn)行文本轉(zhuǎn)換、處理的要求。

來自英文bit,音譯為“比特”,表示二進(jìn)制位。位是計算機(jī)內(nèi)部數(shù)據(jù)儲存的最小單位,11010100是一個8位二進(jìn)制數(shù)。一個二進(jìn)制位只可以表示0和1兩種狀態(tài)(21);兩個二進(jìn)制位可以表示00、01、10、11四種(22)狀態(tài);三位二進(jìn)制數(shù)可表示八種狀態(tài)(23)。

字節(jié)

字節(jié)是計算機(jī)中數(shù)據(jù)處理的基本單位。計算機(jī)中以字節(jié)為單位存儲和解釋信息,規(guī)定一個字節(jié)由八個二進(jìn)制位構(gòu)成,即1個字節(jié)等于8個比特(1Byte=8bit)。八位二進(jìn)制數(shù)最小為00000000,最大為11111111;通常1個字節(jié)可以存入一個ASCII碼,2個字節(jié)可以存放一個漢字國標(biāo)碼。

計算機(jī)進(jìn)行數(shù)據(jù)處理時,一次存取、加工和傳送的數(shù)據(jù)長度稱為字(word)。一個字通常由一個或多個(一般是字節(jié)的整數(shù)位)字節(jié)構(gòu)成。例如286微機(jī)的字由2個字節(jié)組成,它的字長為16;486微機(jī)的字由4個字節(jié)組成,它的字長為32位機(jī)。

字長

字長是指cpu的每個字所包含的位數(shù)。根據(jù)計算機(jī)的不同,字長有固定的和可變的兩種。固定字長,即字長度不論什么情況都是固定不變的;可變字長,則在一定范圍內(nèi),其長度是可變的。計算的字長是指它一次可處理的二進(jìn)創(chuàng)數(shù)字的數(shù)目。計算機(jī)處理數(shù)據(jù)的速率,自然和它一次能加工的位數(shù)以及進(jìn)行運算的快慢有關(guān)。如果一臺計算機(jī)的字長是另一臺計算機(jī)的兩倍,即使兩臺計算機(jī)的速度相同,在相同的時間內(nèi),前者能做的工作是后者的兩倍。

碼位

又稱字符的標(biāo)識。在Unicode標(biāo)準(zhǔn)中以4~6個十六進(jìn)制數(shù)字表示,并加前綴“U+”。例如字母A的碼位是U+0041

編碼

把碼位轉(zhuǎn)換成字節(jié)序列,調(diào)用s.encode()

解碼

把字節(jié)序列轉(zhuǎn)換成碼位,調(diào)用s.decode()

編解碼例子:

s="S?o Paulo"

a=s.encode('utf8')

print(a)#b'S\xc3\xa3o Paulo'

b=a.decode("utf8")

print(b)

output:S?o Paulo

二、編解碼問題

1、編解碼器

latin1( 即 iso8859_1)

一種重要的編碼, 是其他編碼的基礎(chǔ)。 例如 cp1252 和Unicode( 注意, latin1 與 cp1252 的字節(jié)值是一樣的, 甚至連碼位也相同) 。

cp1252

Microsoft 制定的 latin1 超集, 添加了有用的符號, 例如彎引號和€( 歐元) ; 有些 Windows 應(yīng)用把它稱為“ANSI”, 但它并不是 ANSI 標(biāo)準(zhǔn)。

cp437

IBM PC 最初的字符集, 包含框圖符號。 與后來出現(xiàn)的 latin1 不兼容。

gb2312

用于編碼簡體中文的陳舊標(biāo)準(zhǔn); 這是亞洲語言中使用較廣泛的多字節(jié)編碼之一。

utf-8

目前 Web 中最常見的 8 位編碼; 與 ASCII 兼容( 純 ASCII 文本是有效的 UTF-8 文本) 。

utf-16le

UTF-16 的 16 位編碼方案的一種形式; 所有 UTF-16 支持通過轉(zhuǎn)義序列( 稱為“代理對”, surrogate pair) 表示超過 U+FFFF 的碼位。

2、了解編解碼問題

了解有關(guān)Unicode錯誤的處理方法。

2.1 UnicodeEncodeError

編碼出現(xiàn)的錯誤在于編碼器可能無法對字符串編碼,以中英文字符串為例:

city="DaLian大連"

print(city.encode("utf8"))#b'DaLian\xe5\xa4\xa7\xe8\xbf\x9e'

print(city.encode("iso8859_1"))

輸出報錯:

Traceback (most recent call last):

File "D:\韓文承\(zhòng)編程工作空間\Fluent Python\section4-1.py", line 10, in

print(city.encode("iso8859_1"))

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 6-7: ordinal not in range(256)

原因在于這個latin1不會對中午編碼,所以我們需要處理這個EncodeError,處理如下:

print(city.encode("iso8859_1",errors="ignore"))#b'DaLian'

print(city.encode("iso8859_1",errors="replace"))#b'DaLian??'

print(city.encode("iso8859_1",errors="xmlcharrefreplace"))#b'DaLian大連'

errors="ignore"

跳過無法編碼的字符,這樣做通常不妥。

errors="replace"

用問號替代無法編碼的字符,雖然損壞了數(shù)據(jù),但用戶收到了編碼有問題的信號。

errors="xmlcharrefreplace"

用xml實體代替無法編碼的字符。

2.2 UnicodeDecodeError

解碼出現(xiàn)的錯誤在于陳舊的解碼器能解碼任何字節(jié)序列而不拋出錯誤,有時會解碼出無用的、亂碼的字符。以包含變音符號的字節(jié)序列為例:

c=b"Montr\xe9al"

print(c.decode("iso8859_1"))#Montréal

print(c.decode("cp1252"))#Montréal

print(c.decode("cp437"))#MontrΘal 輸出已經(jīng)有問題了

print(c.decode("koi8_r"))#MontrИal KOI8_R是編碼俄文的,此處輸出了俄文字母

print(c.decode("utf8"))

報錯:

Traceback (most recent call last):

File "D:\韓文承\(zhòng)編程工作空間\Fluent Python\section4-1.py", line 19, in

print(c.decode("utf8"))

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 5: invalid continuation byte

原因在于utf_8檢測到c不是有效utf_8字符串,拋出UnicodeDecodeError。處理如下:

print(c.decode("utf8",errors="replace"))#Montr�al。用�替代無法解碼的字節(jié)

2.3 SyntaxError

如果加載的模塊中包含utf_8之外的數(shù)據(jù),那么解釋器會報錯SyntaxError。

3、Chardet

Chardet是Python的一個庫,可以檢測出未知字節(jié)序列的編碼方式。

不要在二進(jìn)制模式中打開文本文件。即使想判斷編碼,也該用Chardet!

4、BOM(byte-order mark)

字節(jié)序標(biāo)記,這個標(biāo)記針對非單字節(jié)非字符串外的其余數(shù)據(jù)(如short,int)指明字節(jié)存儲的方式,具體分為大端存儲和小端存儲。

大端存儲第一個字節(jié)是高位,容易判斷數(shù)值的正負(fù);

小端存儲第一個字節(jié)是地位,容易進(jìn)行數(shù)值的運算。

需要注意:TCP/IP協(xié)議規(guī)定網(wǎng)絡(luò)字節(jié)序為大端字節(jié)序。這意味著主機(jī)字節(jié)序如果是小端存儲必須轉(zhuǎn)化為大端字節(jié)序才能通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù)。

To Learn More:https://zhuanlan.zhihu.com/p/...

三、文本處理

1、處理文本文件

編碼默認(rèn)值

在多系統(tǒng)處理文件時應(yīng)顯式制定編碼,否則容易出現(xiàn)默認(rèn)編碼器無法解碼字節(jié)序列的情況。

編輯器默認(rèn)編碼查詢:locale.getpreferredencoding()#cp936

Unicode三明治原則

我們可以用一個簡單的原則處理編碼問題: 字節(jié)序列->字符串->字節(jié)序列。就是說程序中應(yīng)當(dāng)僅處理字符串,當(dāng)需要保存到文件系統(tǒng)或者傳輸?shù)臅r候,編碼為字節(jié)序列。

2、規(guī)范化處理

Unicode字符串規(guī)范化

碼位規(guī)范化函數(shù):unicodedata.normalize(格式,字符串)

格式參數(shù):

NFC:使用最少的碼位構(gòu)造等價字符串

NFD :使用基字符和組合字符構(gòu)造等價字符串

NFKC 和NFKD:將兼容字符分解

對大多數(shù)應(yīng)用來說NFC是最好的規(guī)范化形式。

from unicodedata import normalize

d="café"

e="cafe\u0301"

print(normalize("NFC",d)==normalize("NFC",e))#True

print(normalize("NFD",d)==normalize("NFD",e))#True

規(guī)范化之后兩個不同的碼位相等的。

保存文件之前最好用規(guī)范化函數(shù)unicodedata.normalize(“NFC”,字符串)清洗字符串

大小寫折疊函數(shù):str.casefold()

自Python3.4起,str.lower()和str.casefold()不同的結(jié)果有116個碼位,占Unicode命名的總字符的0.11%

3、文本排序

Unicode 排序:unicode collation algorithm, UCA 使用 PyUCA 庫。

下載地址:https://pypi.python.org/pypi/...

四、雙模式API

雙模式是指標(biāo)準(zhǔn)庫中一些函數(shù)能夠接受字符串或字節(jié)序列為參數(shù),并根據(jù)類型進(jìn)行處理。

API(Application Programming Interface)即應(yīng)用程序接口。可以把 API 理解為一個軟件組件或是一個 Web 服務(wù)與外界進(jìn)行的交互的接口。通俗的理解是程序和程序之間的交互,交互就是傳遞數(shù)據(jù),觸發(fā)功能。

1、re模塊:構(gòu)建正則表達(dá)式處理字符串。

正則表達(dá)式:可以匹配文本片段的模式。

1.1語法介紹:

通配符:

.點dot:能夠匹配任意的字符。

^尖號:從開始匹配,意味著開始的字符必須和partern一致方可匹配上,否則匹配返回none.。

$美元符號:從尾部開始匹配,尾部開始的字符必須和partern一致方可匹配上,否則匹配返回none.。

*星號:允許模式重復(fù)0次或多次。

+加號:允許模式重復(fù)1次或多次。

?問號:允許模式重復(fù)0次或1次。

{m,n}:允許模式重復(fù)m~n次。(貪婪匹配下直接匹配到n次)當(dāng)m=n即為{m},只匹配m次。

用反斜線對特殊符號進(jìn)行轉(zhuǎn)義:

有時我們只想用特殊符號如dot“."的字面意思,而非作為通配符使用。例如匹配網(wǎng)站”baidu.com“中的點就需要轉(zhuǎn)義,變成"baidu\.com",即只匹配”baidu.com“

字符集:

表示欲匹配字符的集合,相比較通配符中的點號而言范圍更小一些。例如[0-9A-F]可以匹配一個十六進(jìn)制的字符。

注意:一個字符集只能匹配一個字符,除非配合數(shù)量限定符使用!

預(yù)定義字符集

d,數(shù)字[0-9]

D,非數(shù)字[^\d]

s,空白字符,包括空格,trnfv

S,非空白字符[^\s]

w,單詞字符[A-Za-z0-9_]

W,非單詞字符[^\w]

選擇符和子模式:

此項欲匹配的范圍比字符集還要小。比如你只想匹配python和people這兩個單詞,就可以用管道符號(|),即“python|people"。

如果操作的不是整個模式partern而是模式的一部分,圓括號括起來的部分稱作子模式,即“p(ython|eople)”

1.2重要的函數(shù):

函數(shù)

描述

re.compile(pattern, flags=0)

根據(jù)正則表達(dá)式的字符串創(chuàng)建模式對象

re.search(pattern, string, flags=0)

在字符串中尋找模式

re.match(pattern, string, flags=0)

在字符串的開始處匹配模式

re.split(pattern, string, maxsplit=0, flags=0)

根據(jù)模式的匹配項來分割字符串

re.findall(pattern, string, flags=0)

列出字符串中模式的所有匹配項

re.finditer(pattern, string, flags=0)

返回一個迭代器,其中包含滿足正則表達(dá)式要求的match objects

re.sub(pattern, repl, string, count=0, flags=0)

將字符串中所有pat的匹配項用repl替換

re.escape(pattern) 將字符串中所有特殊正則表達(dá)式字符轉(zhuǎn)義

Tips:re.compile構(gòu)建模式,對于重復(fù)式的匹配效率更高。

flags參數(shù)介紹:

re.I 或re.IGNORECASE

使匹配忽略字母大小寫。

re.L或re.LOCALE

影響 “w, “W, “b, 和 “B,這取決于當(dāng)前的本地化設(shè)置。

re.M或re.MULTILINE

使用本標(biāo)志后,‘^’和‘$’匹配行首和行尾時,會增加換行符之前和之后的位置。

re.S或re.DOTALL

使點號這個特殊字符完全匹配任何字符,包括換行;沒有這個標(biāo)志, “.” 匹配除了換行符外的任何字符。

re.X或re.VERBOSE

當(dāng)該標(biāo)志被指定時,在 RE 字符串中的空白符被忽略,除非該空白符在字符類中或在反斜杠之后。它也可以允許你將注釋寫入 RE,這些注釋會被引擎忽略;注釋用 “#”號 來標(biāo)識,不過該符號不能在字符串或反斜杠之后。

1.3MatchObject對象

MatchObject是一次成功匹配后返回的對象類型,它支持如下的重要方法:

group([group1, …]):

獲得一個或多個分組截獲的字符串;指定多個參數(shù)時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數(shù)時,返回group(0);沒有截獲字符串的組返回None;截獲了多次的組返回最后一次截獲的子串。

groups():

以元組形式返回全部分組截獲的字符串。相當(dāng)于調(diào)用group(1,2,…last)。

start([group]):

返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引)。group默認(rèn)值為0。

end([group]):

返回指定的組截獲的子串在string中的結(jié)束索引(子串最后一個字符的索引+1)。group默認(rèn)值為0。

span([group]):

返回(start(group), end(group))。

1.4貪婪和非貪婪模式

*和+這類數(shù)量限定符默認(rèn)是貪婪的,即盡可能多的匹配滿足要求的字符串。只有在其后加上問號?方可變成非貪婪的。

貪婪與非貪婪eg:

import re

greedy=re.compile(r"<.>")#貪婪

non_greedy=re.compile(r"<.>")#非貪婪,利用問號限制

print(greedy.search("

Chapter 1 - 介紹正則表達(dá)式

"))

print(non_greedy.search("

Chapter 1 - 介紹正則表達(dá)式

"))

輸出:

對字符串和字節(jié)序列進(jìn)行re匹配:

import re

text_str = "Ramanujan saw \u0be7\u0bed\u0be8\u0bef as 1729 = 13 + 123 = 93 + 103."

text_byte=text_str.encode('utf_8')

str_number=re.compile(r"\d+")

str_word=re.compile(r"\w+")

byte_number=re.compile(rb"\d+")

byte_word=re.compile(rb"\w+")

print("str_number",str_number.findall(text_str))

print("str_word",str_word.findall(text_str))

print("byte_number",byte_number.findall(text_byte))

print("byte_word",byte_word.findall(text_byte))

輸出:

str_number ['????', '1729', '1', '12', '9', '10']

byte_number [b'1729', b'1', b'12', b'9', b'10']

str_word ['Ramanujan', 'saw', '????', 'as', '1729', '13', '123', '93', '103']

byte_word [b'Ramanujan', b'saw', b'as', b'1729', b'1', b'12', b'9', b'10']

分析:通過分別對字符串和字節(jié)序列進(jìn)行數(shù)字、單詞字符的匹配操作,容易發(fā)現(xiàn)對字節(jié)序列的匹配僅限于ASCII中的數(shù)字和單詞字符,而對字符串的匹配會包含更多的泰米爾數(shù)字和上標(biāo)等其他字符。

To Learn More: https://docs.python.org/3/lib...

2、os模塊:

os.listdir() :

用于返回指定的文件夾包含的文件或文件夾的名字的列表。這個列表以字母順序。

os.fsencode(filename):

如果 filename 是 str 類型或bytes 類型,使用sys.getfilesystemencoding() 返回的編解碼器把 filename 編碼成字節(jié)序列; 否則, 返回未經(jīng)修改的 filename 字節(jié)序列。

os.fsdecode(filename):

如果 filename 是 bytes 類型或 str 類型, 使用sys.getfilesystemencoding() 返回的編解碼器把 filename 解碼成字符串; 否則, 返回未經(jīng)修改的 filename 字符串。

總結(jié)

以上是生活随笔為你收集整理的python序列符号_Python中的文本和字节序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。