python編碼識別
⑴ python編碼的問題
ot=os.listdir("F:")
printot
測試了下上面這兩條語句,中文命名的文件夾列表顯示如下:
['xd2xf4xc0xd6', 'xcdxbcxc6xac']
這不叫亂碼,只是以utf-8編碼表示中文字元串。你的本意是想要得到['abc', 'bcd', '音樂', '圖片']這種形式的輸出,但是實際顯示卻是utf-8編碼。
假設我們創建一個列表 ot = ['abc', 'bcd', '音樂', '圖片'],並且文件開頭定義了以utf-8格式進行編碼。那麼在內存里列表對象ot存儲的是'abc', 'bcd', 'xd2xf4xc0xd6', 'xcdxbcxc6xac'這四個值。
為什麼英文字元還是英文,中文字元就變成「亂碼」了呢?因為計算機不是人,它是看不懂'音樂'和'圖片'這幾個漢字字元的,它只認識字元的編碼值。對於多種編碼來說,鍵盤上那些英文字元編碼值都是一樣的。中文則不一樣。
為什麼列印字元串顯示出了中文,列印列表的時候顯示的卻是utf-8編碼?print 的作用是把計算機可理解的對象以人類可以理解的方式列印出來,具體顯示結果跟你要列印的對象有關,列印的是字元串,顯示的就是人類語言表示的字元串對象,列印的是列表,顯示的就是列表對象本身,也即該列表裡存儲的值。
printot表示列印一個列表對象ot,列印的是列表本身,所以它裡面的項以什麼形式存儲的就以
什麼形式顯示。
⑵ python怎麼知道一個字元串的編碼方式
字元串的編碼,有很多種如utf-8,gb2312,gbk,gb18030,bz2,zlib,big5,bzse64
python 對編碼的處理有兩個方法,decode()和 encode()方法
a='你好'
b='python'
printa.decode('utf-8').encode('gbk')##decode方法把字元串轉換為unicode對象,然後通過encode方法轉換為指定的編碼字元串對象
printb.decode('utf-8')##decode方法把字元串轉換為unicode對象
所以要讓python(或者說機器)來識別字元串的編碼,是一件很困難的事。編碼就是漢字和整數之間的對應,同一個整數,可以在不同的編碼中,都有對應的漢字。比如下面的例子,比特流'xe6xb0xb4xe5xa3xb6'在四種編碼中都有對應的漢字,但只有在utf-8編碼下,它對應的漢字才有意義。我們可以一眼看出這點,可是要讓計算機做到這點,就很難了。
>>>s='水壺'
>>>s
18:'xe6xb0xb4xe5xa3xb6'
>>>printunicode(s,'big5')
瘞游ㄥ
>>>printunicode(s,'gbk')
姘村6
>>>printunicode(s,'gb2312')
姘村6
>>>printunicode(s,'utf-8')
水壺
⑶ Python基本編碼格式
1、一般來說,聲明編碼格式在腳本中是必需的。2、如果Python源碼文件沒有聲明編碼格式,Python解釋器會默認使用ASCII編碼。但出現非ASCII編碼的字元,Python解釋器就會報錯。
1、Python 採用代碼縮進和冒號( : )來區分代碼塊之間的層次。2、在 Python 中,對於類定義、函數定義、流程式控制制語句、異常處理語句等,行尾的冒號和下一行的縮進,表示下一個代碼塊的開始,而縮進的結束則表示此代碼塊的結束。3、Python 中實現對代碼的縮進,可以使用空格或者 Tab 鍵實現。但無論是手動敲空格,還是使用 Tab 鍵,通常情況下都是採用 4 個空格長度作為一個縮進量(默認情況下,一個 Tab 鍵就表示 4 個空格)。4、對於 Python 縮進規則,初學者可以這樣理解,Python 要求屬於同一作用域中的各行代碼,它們的縮進量必須一致,但具體縮進量為多少,並不做硬性規定。
正確示例代碼:
錯誤示例代碼:
Python中使用 # 進行注釋,我們在使用# 的時候,# 號後面要空一格在行內注釋的時候,中間應該至少加兩個空格
print("你好,世界") # 注釋
** 使用的一般性原則:**
1、在二元運算符兩邊各空一格,算術操作符兩邊的空格可靈活使用,但兩側務必要保持一致2、不要在逗號、分號、冒號前面加空格,但應該在它們後面加(除非在行尾)3、函數的參數列表中,逗號之後要有空格4、函數的參數列表中,默認值等號兩邊不要添加空格5、左括弧之後,右括弧之前不要加添加空格6、參數列表, 索引或切片的左括弧前不應加空格
使用的一般性原則:
1、編碼格式聲明、模塊導入、常量和全局變數聲明、頂級定義和執行代碼之間空兩行2、頂級定義之間空兩行,方法定義之間空一行3、在函數或方法內部,可以在必要的地方空一行以增強節奏感,但應避免連續空行
1、導入總應該放在文件頂部,位於模塊注釋和文檔字元串之後,模塊全局變數和常量之前。
2、導入應該按照從最通用到最不通用的順序分組,分組之間空一行:
3、每個 import 語句只導入一個模塊,盡量避免一次導入多個模塊
命名規范這一塊的大家應該都比較熟悉了,但是不同的編程語言之間的明明規范也是有所區別的~
Python命名建議遵循的一般性原則:
引號使用的一般性原則:
Python跟其他幾個主流編程語言的分號使用區別很大Python的代碼末尾不需要加分號,而Java和C#等都需要添加
不要在行尾添加分號,也不要用分號將兩條命令放在同一行,例如:
Python學習日記
⑷ Python判斷字元串有多少bit(2023年最新解答)
導讀:今天首席CTO筆記來給各位分享關於Python判斷字元串有多少bit的相關內容,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧!
python3字元串都是什麼編碼編碼
字元串是一種數據類型,但是,字元串比較特殊的是還有一個編碼問題。
因為計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。最早的計算機在設計時採用8個比特(bit)作為一個位元組(byte),所以,一個位元組能表示的最大的整數就是255(二進制11111111=十進制255),如果要表示更大的整數,就必須用更多的位元組。比如兩個位元組可以表示的最大整數是65535,4個位元組可以表示的最大整數是4294967295。
由於計算機是美國人發明的,因此,最早只有127個字母被編碼到計算機里,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。
Unicode
Unicode把所有語言都統一到一套編碼里,這樣就不會再有亂碼問題了。
Unicode標准也在不斷發展,但最常用的是用兩個位元組表示一個字元(如果要用到非常偏僻的字元,就需要4個位元組)。現代操作系統和大多數編程語言都直接支持Unicode。
現在,捋一捋ASCII編碼和Unicode編碼的區別:ASCII編碼是1個位元組,而Unicode編碼通常是2個位元組。
字母A用ASCII編碼是十進制的65,二進制的01000001;
字元0用ASCII編碼是十進制的48,二進制的00110000,注意字元Ɔ'和整數0是不同的;
漢字已經超出了ASCII編碼的范圍,用Unicode編碼是十進制的20013,二進制的0100111000101101。
如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可以,因此,A的Unicode編碼是0000000001000001。
新的問題又出現了:如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不劃算。
所以,又出現了把Unicode編碼轉化為「可變長編碼」的UTF-8編碼。UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間:
字元
ASCII
Unicode
UTF-8
A??01000001??0000000001000001??01000001?
中??x??0100111000101101??111001001011100010101101?
從上面的表格還可以發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟體可以在UTF-8編碼下繼續工作。
搞清楚了ASCII、Unicode和UTF-8的關系,我們就可以總結一下現在計算機系統通用的字元編碼工作方式:
在計算機內存中,統一使用Unicode編碼,當需要保存到硬碟或者需要傳輸的時候,就轉換為UTF-8編碼。
用記事本編輯的時候,從文件讀取的UTF-8字元被轉換為Unicode字元到內存里,編輯完成後,保存的時候再把Unicode轉換為UTF-8保存到文件:
瀏覽網頁的時候,伺服器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器:
所以你看到很多網頁的源碼上會有類似metacharset="UTF-8"/的信息,表示該網頁正是用的UTF-8編碼。
Python的字元串
在最新的Python3版本中,字元串是以Unicode編碼的,也就是說,Python的字元串支持多語言,例如:
print('包含中文的str')
包含中文的str
對於單個字元的編碼,Python提供了ord()函數獲取字元的整數表示,chr()函數把編碼轉換為對應的字元:
ord('A')65
ord('中')20013
chr(66)'B'chr(25991)'文'
如果知道字元的整數編碼,還可以用十六進制這么寫str
'u4e26587'//中文
byte
由於Python的字元串類型是str,在內存中以Unicode表示,一個字元對應若干個位元組。如果要在網路上傳輸,或者保存到磁碟上,就需要把str變為以位元組為單位的bytes。
Python對bytes類型的數據用帶b前綴的單引號或雙引號表示:
x=b'ABC'
要注意區分'ABC'和b'ABC',前者是str,後者雖然內容顯示得和前者一樣,但bytes的每個字元都只佔用一個位元組。
以Unicode表示的str通過encode()方法可以編碼為指定的bytes,例如:
'ABC'.encode('ascii')
b'ABC''中文'.encode('utf-8')
b'xe4xb8xadxe6x96x87''中文'.encode('ascii')
Traceback(mostrecentcalllast):
File"stdin",line1,inmoleUnicodeEncodeError:'ascii'codeccan-1:ordinalnotinrange(128)
純英文的str可以用ASCII編碼為bytes,內容是一樣的,含有中文的str可以用UTF-8編碼為bytes。含有中文的str無法用ASCII編碼,因為中文編碼的范圍超過了ASCII編碼的范圍,Python會報錯。
在bytes中,無法顯示為ASCII字元的位元組,用x##顯示。
反過來,如果我們從網路或磁碟上讀取了位元組流,那麼讀到的數據就是bytes。要把bytes變為str,就需要用decode()方法:
b'ABC'.decode('ascii')'ABC'b'xe4xb8xadxe6x96x87'.decode('utf-8')'中文'
要計算str包含多少個字元,可以用len()函數
len('ABC')3
len('中文')2
len()函數計算的是str的字元數,如果換成bytes,len()函數就計算位元組數
len(b'ABC')3
len(b'xe4xb8xadxe6x96x87')6
len('中文'.encode('utf-8'))6
1個中文字元經過UTF-8編碼後通常會佔用3個位元組,而1個英文字元只佔用1個位元組。
在操作字元串時,我們經常遇到str和bytes的互相轉換。為了避免亂碼問題,應當始終堅持使用UTF-8編碼對str和bytes進行轉換。
Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行
#!/usr/bin/envpython3#-*-coding:utf-8-*-
第二行注釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。
格式化:
在Python中,採用的格式化方式和C語言是一致的,用%實現,舉例如下:
format%(...params)
'Hello,%s'%'world''Hello,world''Hi,%s,youhave$%d.'%('Michael',1000000)'Hi,Michael,youhave$1000000.'
%運算符就是用來格式化字元串的。在字元串內部,%s表示用字元串替換,%d表示用整數替換,%x表示16進制整數,有幾個%?佔位符,後面就跟幾個變數或者值,順序要對應好。如果只有一個%?,括弧可以省略。
格式化整數和浮點數還可以指定是否補0和整數與小數的位數:
'%2d-%02d'%(3,1)Ɖ-01''%.2f'%3.1415926Ɖ.14'
有些時候,字元串裡面的%是一個普通字元怎麼辦?這個時候就需要轉義,用%%來表示一個%:
'growthrate:%d%%'%7'growthrate:7%'
day-04總結python字元串
1.什麼是字元串
序列,有序,不可變的
用單引號或者雙引號任意字元集,
2,字元串中的字元
普通字元:ན','sdfsdfsd','++(**^%$#@@','發技術規范舉案說法'
'''
python中的字元採用的是unicode編碼
1.什麼是編碼
就是數字和字元的一一對應的,其中字元對應的數字就是字元的編碼
a-97
b-98
2.編碼方式
ASCII碼表:針對數字字元,字母字元(26個小寫字母和26個大寫字母),一些英文中對應的符號進行編碼
小寫字母要大於大寫字母的編碼值,採用一個位元組對字元進行編碼,只能對128個字元進行編碼
Unicode碼:Unicode碼包含了ASCII碼表,同時能夠對世界上所有語言對應的符號進行編碼,
採用兩個位元組進行編碼,能夠編碼65536個字元
3.兩個函數
chr(編碼值)--將字元編碼值轉化為字元
ord(字元)--獲取字元對應的編碼值
中文編碼范圍0x4e00~~~~~0x9fa5
一旦一個字元串確定了,那麼字元串中每個字元的位置就確定了,而且每個字元會對應一個表示其位置和順序的下標值
1,下標(索引)
字元串中的每一個字元都有一個下標,代表在字元串中的位置
下標范圍是:0到字元串長度---10(代表第一個字元的位置)
-1~字元串長度-1(代表字元串中最後一個字元的位置)
'abc'#''
獲取單個字元
語法:字元串[下標]--獲取字元串中指定下標對應的字元
說明字元串--可以是字元串常量,也可以是字元串變數
[]---固定寫法
下標--字元的下標,不能越界。
獲取部分字元
語法:字元串[開始下標:結束下標:步長]
步長--一個整數
功能:從開始下標獲取到結束下標前位置,每次下標值增加步長,結果是字元串
注意:當步長是整數,開始下標對應的字元要在結束下標的前面
當步長是負數,開始下標對應的字元要在結束下標的後面
方法2:字元串[開始下表:結束下標](相當於步長是一)
獲取部分字元,省略下標
獲取部分字元的時候開始下標和結束下標都可以省略
a.開始下標省略
字元串[:結束下標:步長]或者字元串[:結束下表]
字元串是正數:從字元串開頭開始往後獲取
字元串是負數:從字元串結尾開始往前獲取
結束下標省略
字元串[開始下標::步長]
步長是正數,從開始下標從前往後獲取到字元串最後
步長是負數,從開始下標從後往前獲取到字元串開始
,加法運算
字元串1+字元串2將兩個字元串拼接在一起,產生一個新的字元串
乘法運算
字元串*n(正整數):字元串中的內容重復n次產生一個新的字元串
比較運算符
a.==!=
字元串1==字元串2---------判斷兩個字元串是否相等
b.,,=,=(所有的大寫字母編碼都比小寫的編碼小)
兩個字元串比較大下:從第一個開始,找到第一對不同的字元,然後比較他們的編碼值的大小
in和notin
字元串1in字元串2:判斷字元串2是否包含字元串1
字元串1notin字元串2:判斷字元串2是否不包含字元串1
len函數
len(序列)-------獲取序列的長度
len(字元串)----獲取字元串中字元的個數
str函數
str(數據):將數據轉換成字元串
其他數據轉換成字元串
所有的數據都可以轉換成字元串,轉換的時候就是在數據的值的最外面加引號
補充:系統對應的類型名不能用來給變數命名
字元串轉其他類型
字元串轉整數:int(字元串)去掉引號後本身就是個整數的字元串才能轉
字元串轉浮點型:Float(字元串)
字元串轉布爾:boll(字元串),除了空串會轉化成False,其他的都會轉化成True
格式字元串
指的是字元串中通過格式佔位符來表示字元串中變化,然後後面再通過其他的值來給佔位符賦值
含有格式佔位符的字元串%(佔位符對應的值)
說明:
含有格式佔位符有固定寫法,可以有多個
%----固定寫法
()----裡面值的個數要和前面的格式佔位符一一對應
%d--整數
%s--字元串
%f--小數
%c--字元(可以將數字轉換成字元)
字元串.capitalize()-將字元串第一個字元轉換成大寫
2.字元串對齊
字元串.center(width,fillchar)-居中
字元串.ljust(width,fillchar)-左對齊
字元串.rjust(width,fillchar)-右對齊
width-正整數,表示新的字元串的寬度
fillchar-字元,填充字元串
字元串.isalpha若字元串至少有一個字元,並且所有字元都是字母就返回True,否則返回False
字元串。isdigit()若字元串中只包含數字就返回True,否則返回False
若字元串中只包含數字字元,則返回True,否則返回False
3.join(seq)
字元串1.join(字元串2):將字元串1的內容插入到字元串2的每個字元之間
max(字元串)編碼最大
min(字元串)
count(str)|返回str在string裡面出現的次數
|islower()|如果字元串中包含至少一個區分大小寫的字元,並且所有這些(區分大小寫的)字元都是小寫,則返回True,否則返回False
expandtabs(tabsize=8)|把字元串string中的tab符號轉為空格,tab符號默認的空格數是8。
|isspace()|如果字元串中只包含空白,則返回True,否則返回False
endswith(suffix)|檢查字元串是否以obj結束,如果beg或者end指定則檢查指定的范圍內是否以obj結束,如果是,返回True,否則返回False.
python判斷字元串有幾個字元字元串長度
通過內置方法len()來計算字元串的長度,注意這個計算的是字元的長度。
aa='afebb'
bb='你'
printlen(aa)
printlen(bb)
python語言中如何判斷一個字元串有多少位str=raw_input('隨便輸入點什麼')
long=len(str)
如果我輸入的是123456
len是一個內建函數,會計算我str這個變數輸入了幾個字元
最後long就等於6
結語:以上就是首席CTO筆記為大家整理的關於Python判斷字元串有多少bit的相關內容解答匯總了,希望對您有所幫助!如果解決了您的問題歡迎分享給更多關注此問題的朋友喔~
⑸ python3讀文件編碼錯誤怎麼辦
在python3中系統默認編碼是unicode,讀取文件經常會編碼錯誤導致報錯。
首先先確認要讀取文件的編碼,可這樣操作:
記事本打開文本文件,點擊「文件」-「另存為」查看編碼:
importcodecs
f=codecs.open(r"test.txt","r","gbk")
print(f.read())
f.close()
(示例的文件是ANSI所以使用GBK讀取)
以上就可以正確讀取想要的文件了
⑹ python有哪幾種編碼方式
第一種:ASCII碼。是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,它是現今最通用的單位元組編碼系統,並等同於國際標准IS/IEC
646。
由於計算機是美國人發明的,因此,最早只有127個字母被編碼到計算機李,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母a的編碼是97,後128個稱為擴展ASCII碼。
第二種:GBK和GB2312。能在計算機中顯示中文字元是至關重要的,然而ASCII表裡一個偏旁部首都沒有,所以我們需要一個關於中文和數字對應的關系表,一個位元組只能最多表示256個字元,用處理中文顯然一個位元組是不夠的,所以我們需要採用兩個位元組來表示,所以中國制定了GB2312編碼,用來將中文編寫進去。
第三種:Unicode。因為各個國家都有一套自己的編碼,所以無法避免沖突,因此Unicode誕生了。它可以把所有語言都統一到一套編碼里,這樣就不會存在亂碼問題了,現代操作系統和大多數編程語言都直接支持Unicode。
第四種:UFT-8。基於節約的原則,出現了把Unicode編碼轉化為可變長編碼的UTF-8編碼。而UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成一個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組,如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間。
⑺ Python文件處理里encoding和encode有事區別,bytes類型是什麼意思
python問題我來回答你。
首先你要知道的是,字元串在Python內部的表示是unicode(統一碼、萬國碼)編碼,很多編程語言都是這么設計的,各個國家通用編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字元串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
decode的作用是將其他編碼的字元串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字元串str1轉換成unicode編碼。
encode的作用是將unicode編碼轉換成其他編碼的字元串,如str2.encode('gb2312'),表示將unicode編碼的字元串str2轉換成gb2312編碼。
因此,轉碼的時候一定要先搞明白,字元串str是什麼編碼,然後decode成unicode,然後再encode成其他編碼。
bytes類型是 Python 3.x版本新增的數據類型,在 Python 2.x 中是不存在的。字元串是以字元為單位進行處理的,bytes類型是以位元組為單位處理的。
bytes 只負責以位元組序列的形式(二進制形式)來存儲數據,至於這些數據到底表示什麼內容(字元串、數字、圖片、音頻等),完全由程序的解析方式決定。
說白了,bytes 只是簡單地記錄內存中的原始數據,至於如何使用這些數據,bytes 並不在意,你想怎麼使用就怎麼使用,bytes 並不約束你的行為。
bytes 類型的數據非常適合在互聯網上傳輸,可以用於網路通信編程;bytes 也可以用來存儲圖片、音頻、視頻等二進制格式的文件。
舉個例子:
b = b'' # 創建一個空的bytes
b = byte() # 創建一個空的bytes
b = b'hello' # 直接指定這個hello是bytes類型
b = bytes('string',encoding='編碼類型') #利用內置bytes方法,將字元串轉換為指定編碼的bytes
b = str.encode('編碼類型') # 利用字元串的encode方法編碼成bytes,默認為utf-8類型
bytes.decode('編碼類型'):將bytes對象解碼成字元串,默認使用utf-8進行解碼。