真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python重新編碼函數(shù) Python編碼問題

python編碼轉(zhuǎn)換:ascii和GB2312的問題

供參考。gb312本來就是標(biāo)準(zhǔn)ascii的一種擴(kuò)充,ascii可以視同為gb312的子集。所以,如果var的值全部是在ascii里面的話,轉(zhuǎn)成gb312后也還是屬于ascii,所以使用detect函數(shù)的時(shí)候,編碼還是ascii(當(dāng)然同時(shí)也屬于gb312);如果var的值不是全部在ascii里面的話,語句var = var.decode('ascii')可能會(huì)出錯(cuò)。

創(chuàng)新互聯(lián)建站于2013年開始,先為江岸等服務(wù)建站,江岸等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為江岸企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

只要var的值是英文(內(nèi)碼0-127),轉(zhuǎn)換不轉(zhuǎn)換,都已經(jīng)是gb2312編碼。

python 讀取文件時(shí)能指定編碼嗎

代碼如下:

import os

import codecs

filenames=os.listdir(os.getcwd())

out=file("name.txt","w")

for filename in filenames:

out.write(filename.decode("gb2312").encode("utf-8"))

out.close()

將執(zhí)行文件的當(dāng)前目錄及文件名寫入到name.txt文件中,以u(píng)tf-8格式保存

如果采用ANSI編碼保存,用如下代碼寫入即可:

復(fù)制代碼代碼如下:

out.write(filename)

打開文件并寫入

引用codecs模塊,對(duì)該模塊目前不了解。在此記錄下方法,有空掌握該模塊功能及用法。

復(fù)制代碼代碼如下:

import codecs

file=codecs.open("lol.txt","w","utf-8")

file.write(u"我")

file.close()

讀取ANSI編碼的文本文件和utf-8編碼的文件

讀取ANSI編碼文件

建立一個(gè)文件test.txt,文件格式用ANSI,內(nèi)容為:

復(fù)制代碼代碼如下:

abc中文

用python來讀取

復(fù)制代碼代碼如下:

# coding=gbk

print open("Test.txt").read()

結(jié)果:abc中文

讀取utf-8編碼文件(無BOM)

把文件格式改成UTF-8:

復(fù)制代碼代碼如下:

結(jié)果:abc涓 枃

顯然,這里需要解碼:

復(fù)制代碼代碼如下:

# -*- coding: utf-8 -*-

import codecs

print open("Test.txt").read().decode("utf-8")

結(jié)果:abc中文

讀取utf-8編碼文件(有BOM)

某些軟件在保存一個(gè)以UTF-8編碼的文件時(shí),默認(rèn)會(huì)在文件開始的地方插入三個(gè)不可見的字符(0xEF 0xBB 0xBF,即BOM)。在有些軟件可以控制是否插入BOM。如果在有BOM的情況下,在讀取時(shí)需要自己去掉這些字符,python中的codecs module定義了這個(gè)常量:

復(fù)制代碼代碼如下:

# -*- coding: utf-8 -*-

import codecs

data = open("Test.txt").read()

if data[:3] == codecs.BOM_UTF8:

data = data[3:]

print data.decode("utf-8")

結(jié)果:abc中文

在看下面的例子:

復(fù)制代碼代碼如下:

# -*- coding: utf-8 -*-

data = open("name_utf8.txt").read()

u=data.decode("utf-8")

print u[1:]

打開utf-8格式的文件并讀取utf-8字符串后,解碼變成unicode對(duì)象。但是會(huì)把附加的三個(gè)字符同樣進(jìn)行轉(zhuǎn)換,變成一個(gè)unicode字符。該字符不能被打印。所以為了正常顯示,采用u[1:]的方式,過濾到第一個(gè)字符。

注意:在處理unicode中文字符串的時(shí)候,必須首先對(duì)它調(diào)用encode函數(shù),轉(zhuǎn)換成其它編碼輸出。

設(shè)置python默認(rèn)編碼

復(fù)制代碼代碼如下:

import sys

reload(sys)

sys.setdefaultencoding("utf-8")

print sys.getdefaultencoding()

今天碰到了 python 編碼問題, 報(bào)錯(cuò)信息如下

復(fù)制代碼代碼如下:

Traceback (most recent call last):

File "ntpath.pyc", line 108, in join

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position 36: ordinal not in range(128)

顯然是當(dāng)前的編碼為ascii, 無法解析0xa1(十進(jìn)制為161, 超過上限128). 進(jìn)入python console后, 發(fā)現(xiàn)默認(rèn)編碼確實(shí)是 ascii, 驗(yàn)證過程為:

在python2.6中無法調(diào)用sys.setdefaultencoding()函數(shù)來修改默認(rèn)編碼,因?yàn)閜ython在啟動(dòng)的時(shí)候會(huì)調(diào)用site.py文件,在這個(gè)文件中設(shè)置完默認(rèn)編碼后會(huì)刪除sys的setdefaultencoding方法。不能再被調(diào)用了. 在確定sys已經(jīng)導(dǎo)入的情況下, 可以reload sys這個(gè)模塊之后, 再 sys.setdefaultencoding('utf8')

復(fù)制代碼代碼如下:

import sys

reload(sys)

sys.setdefaultencoding("utf-8")

print sys.getdefaultencoding()

確實(shí)有效, 根據(jù) limodou 講解, site.py 是 python 解釋器啟動(dòng)后, 默認(rèn)加載的一個(gè)腳本. 如果使用 python -S 啟動(dòng)的話, 將不會(huì)自動(dòng)加載 site.py.

上面寫的挺啰嗦的.

==================================

如何永久地將默認(rèn)編碼設(shè)置為utf-8呢? 有2種方法:

==================================

第一個(gè)方法不推薦: 編輯site.py, 修改setencoding()函數(shù), 強(qiáng)制設(shè)置為 utf-8

第二個(gè)方法推薦: 增加一個(gè)名為 sitecustomize.py, 推薦存放的路徑為 site-packages 目錄下

sitecustomize.py 是在 site.py 被import 執(zhí)行的, 因?yàn)?sys.setdefaultencoding() 是在 site.py 的最后刪除的, 所以, 可以在 sitecustomize.py 使用 sys.setdefaultencoding().

復(fù)制代碼代碼如下:

import sys

sys.setdefaultencoding('utf-8')

既然 sitecustomize.py 能被自動(dòng)加載, 所以除了設(shè)置編碼外, 也可以設(shè)置一些其他的東西

字符串的編碼

復(fù)制代碼代碼如下:

s1='中文'

像上面那樣直接輸入的字符串是按照代碼文件的編碼來處理的,如果是unicode編碼,有以下三種方式:

復(fù)制代碼代碼如下:

1 s1 = u'中文'

2 s2 = unicode('中文','gbk')

3 s3 = s1.decode('gbk')

unicode是一個(gè)內(nèi)置函數(shù),第二個(gè)參數(shù)指示源字符串的編碼格式。

decode是任何字符串具有的方法,將字符串轉(zhuǎn)換成unicode格式,參數(shù)指示源字符串的編碼格式。

encode也是任何字符串具有的方法,將字符串轉(zhuǎn)換成參數(shù)指定的格式。

python3.3中文亂碼與默認(rèn)編碼格式設(shè)定。

python 3和2很大區(qū)別就是python本身改為默認(rèn)用unicode編碼。

字符串不再區(qū)分"abc"和u"abc", 字符串"abc"默認(rèn)就是unicode,不再代表本地編碼、

由于有這種內(nèi)部編碼,像c#和java類似,再?zèng)]有必要在語言環(huán)境內(nèi)做類似設(shè)置編碼,比如“sys.setdefaultencoding”;

也因此也python 3的代碼和包管理上打破了和2.x的兼容。2.x的擴(kuò)展包要適應(yīng)這種情況改寫。

另一個(gè)問題是語言環(huán)境內(nèi)只有unicode怎么輸出gbk之類的本地編碼。

答按慣例都在(序列化)輸出時(shí)才轉(zhuǎn)換成本地編碼。

比如

file.write("GBK的中文".encode("GBK"))

python環(huán)境內(nèi)字符串用str.encode("GBK")方法輸出成字節(jié)串用于和其他環(huán)境交流。

python基礎(chǔ)——編碼、bytes與str轉(zhuǎn)換及格式化

對(duì)于單個(gè)字符的編碼,Python提供了ord()函數(shù)獲取字符的整數(shù)表示,chr()函數(shù)把編碼轉(zhuǎn)換為對(duì)應(yīng)的字符:

最常用的編碼是UTF-8,如果沒有特殊業(yè)務(wù)要求,請(qǐng)牢記僅使用UTF-8編碼。

在爬蟲中會(huì)經(jīng)常遇見,需要用encode和decode來進(jìn)行互相轉(zhuǎn)碼

str轉(zhuǎn)bytes

注意,含有中文字符的str不能用acsii格式轉(zhuǎn)碼

bytes轉(zhuǎn)str

** 程序中經(jīng)常會(huì)遇到個(gè)別字符轉(zhuǎn)碼不成功而報(bào)錯(cuò),因此在decode方法中需要這個(gè)參數(shù)errors='ignore'忽略錯(cuò)誤的字節(jié)

注意格式化的數(shù)據(jù)格式

python3.4 編碼有哪些

Python3中的編碼問題前,第一個(gè)段落對(duì)字節(jié)、ASCII與Unicode與UTF-8等進(jìn)行基本介紹,如果不對(duì)這幾種編碼犯頭暈,可直接跳過。

ASCII與Unicode與UTF-8與GBK

首先從老大哥說起。跟很多人一樣,大學(xué)讀了這么久,久仰ASCII編碼的大名。要說這個(gè)老大哥,我們?cè)傧葟淖止?jié)說起。一個(gè)字節(jié)包括八個(gè)比特位,每個(gè)比特位表示0或1,一個(gè)字節(jié)即可表示從00000000到11111111共2^8=256個(gè)數(shù)字。一個(gè)ASCII編碼使用一個(gè)字節(jié)(除去字節(jié)的最高位作為作奇偶校驗(yàn)位),ASCII編碼實(shí)際使用一個(gè)字節(jié)中的7個(gè)比特位來表示字符,共可表示2^7=128個(gè)字符。比如那時(shí)寫C語言的程序,就經(jīng)常要背下ASCII編碼中的01000001(即十進(jìn)制的65)表示字符‘A’,01000001加上32之后的01100001(即十進(jìn)制的97)表示字符‘a(chǎn)’。現(xiàn)在打開Python,調(diào)用chr和ord函數(shù),我們可以看到Python為我們對(duì)ASCII編碼進(jìn)行了轉(zhuǎn)換。

第一個(gè)00000000表示空字符,因此ASCII編碼實(shí)際上只包括了

字母、標(biāo)點(diǎn)符號(hào)、特殊符號(hào)等共127個(gè)字符。因?yàn)锳SCII是在美國(guó)出生的,對(duì)于由字母組成單詞進(jìn)而用單詞表達(dá)的英文來說也是夠了。但是中國(guó)人、日本人、

韓國(guó)人等其他語言的人不服了。中文是一個(gè)字一個(gè)字,ASCII編碼用上了渾身解數(shù)256個(gè)字符都不夠用。

因此后來出現(xiàn)了Unicode編碼。Unicode編碼通常由兩個(gè)字節(jié)組成,共表示256*256個(gè)字符,即所謂的UCS-2。某些偏僻字還會(huì)用到四個(gè)字節(jié),即所謂的UCS-4。也就是說Unicode標(biāo)準(zhǔn)也還在發(fā)展。但UCS-4出現(xiàn)的比較少,我們先記?。鹤钤嫉腁SCII編碼使用一個(gè)字節(jié)編碼,但由于語言差異字符眾多,人們用上了兩個(gè)字節(jié),出現(xiàn)了統(tǒng)一的、囊括多國(guó)語言的Unicode編碼。

在Unicode中,原本ASCII中的127個(gè)字符只需在前面補(bǔ)一個(gè)全零的字節(jié)即可,比如前文談到的字符‘a(chǎn)’:01100001,在Unicode中變成了00000000 01100001。不久,美國(guó)人不開心了,吃上了世界民族之林的大鍋飯,原本只需一個(gè)字節(jié)就能傳輸?shù)挠⑽默F(xiàn)在變成兩個(gè)字節(jié),非常浪費(fèi)存儲(chǔ)空間和傳輸速度。

人們?cè)侔l(fā)揮聰明才智,于是出現(xiàn)了UTF-8編碼。因?yàn)獒槍?duì)的是空間浪費(fèi)問題,因此這種UTF-8編碼是可變長(zhǎng)短的,從英文字母的一個(gè)字節(jié),到中文的通常的三個(gè)字節(jié),再到某些生僻字的六個(gè)字節(jié)。解決了空間問題,UTF-8編碼還有一個(gè)神奇的附加功能,那就是兼容了老大哥的ASCII編碼。一些老古董軟件現(xiàn)在在UTF-8編碼中可以繼續(xù)工作。

注意除了英文字母相同,漢字在Unicode編碼和UTF-8編碼中通常是不同的。比如漢字的‘中’字在Unicode中是01001110

00101101,而在UTF-8編碼中是11100100 10111000

10101101。

我們祖國(guó)母親自然也有自己的一套標(biāo)準(zhǔn)。那就是GB2312和GBK。當(dāng)然現(xiàn)在挺少看到。通常都是直接使用UTF-8。記得我唯一一次看到GB編碼的網(wǎng)頁,是一個(gè)成人網(wǎng)站。

Python3中的默認(rèn)編碼

Python3中默認(rèn)是UTF-8,我們通過以下代碼:

import sys

sys.getdefaultencoding()

可查看Python3的默認(rèn)編碼。

Python3中的encode和decode

Python3中字符編碼經(jīng)常會(huì)使用到decode和encode函數(shù)。特別是在抓取網(wǎng)頁中,這兩個(gè)函數(shù)用的熟練非常有好處。我的理解,encode的作用,使我們看到的直觀的字符轉(zhuǎn)換成計(jì)算機(jī)內(nèi)的字節(jié)形式。decode剛好相反,把字節(jié)形式的字符轉(zhuǎn)換成我們看的懂的、直觀的、“人模人樣”的形式。如下圖。

\x表示后面是十六進(jìn)制,\xe4\xb8\xad即是二進(jìn)制的11100100 10111000

10101101。也就是說漢字‘中’encode成字節(jié)形式,是11100100 10111000

10101101。同理,我們拿11100100

10111000 10101101也就是\xe4\xb8\xad來decode回來,就是漢字‘中’。完整的應(yīng)該是b'\xe4\xb8\xad',在Python3中,以字節(jié)形式表示的字符串則必須加上前綴b,也就是寫成上文的b'xxxx'形式。

前文說的Python3的默認(rèn)編碼是UTF-8,所以我們可以看到,Python處理這些字符的時(shí)候是以UTF-8來處理的。因此從上圖可以看到,就算我們通過encode('utf-8')特意把字符encode為UTF-8編碼,出來的結(jié)果還是相同:b'\xe4\xb8\xad'。

明白了這一點(diǎn),同時(shí)我們知道UTF-8兼容ASCII,我們可以猜想大學(xué)時(shí)經(jīng)常背誦的‘A’對(duì)應(yīng)ASCII中的65,在這里是不是也能正確的decode出來呢。十進(jìn)制的65轉(zhuǎn)換成十六進(jìn)制是41,我們嘗試下:

b'\x41'.decode()

結(jié)果如下。果然是字符‘A’

Python3中的編碼轉(zhuǎn)換

據(jù)說字符在計(jì)算機(jī)的內(nèi)存中統(tǒng)一是以Unicode編碼的。只有在字符要被寫進(jìn)文件、存進(jìn)硬盤或者從服務(wù)器發(fā)送至客戶端(例如網(wǎng)頁前端的代碼)時(shí)會(huì)變成utf-8。但其實(shí)我比較關(guān)心怎么把這些字符以Unicode的字節(jié)形式表現(xiàn)出來,露出它在內(nèi)存中的廬山正面目的。這里有個(gè)照妖鏡:

xxxx.encode/decode('unicode-escape')

輸出如下

b'\\u4e2d'還是b'\u4e2d,一個(gè)斜杠貌似沒影響。同時(shí)可以發(fā)現(xiàn)在shell窗口中,直接輸'\u4e2d'和輸入b'\u4e2d'.decode('unicode-escape')是相同的,都會(huì)打印出漢字‘中’,反而是'\u4e2d'.decode('unicode-escape')會(huì)報(bào)錯(cuò)。說明說明Python3不僅支持Unicode,而且一個(gè)‘\uxxxx’格式的Unicode字符可被辨識(shí)且被等價(jià)于str類型。

如果我們知道一個(gè)Unicode字節(jié)碼,怎么變成UTF-8的字節(jié)碼呢。懂了以上這些,現(xiàn)在我們就有思路了,先decode,再encode。代碼如下:

xxx.decode('unicode-escape').encode()

測(cè)試如下:

可以看到最后輸出的UTF-8字節(jié)與上面的相同。嘗試成功。所以其他的編碼之間的轉(zhuǎn)換,大概也是如此。

最后的擴(kuò)展

還記得剛剛那個(gè)ord嗎。時(shí)代變遷,老大哥ASCII被人合并,但ord還是有用武之地。試試ord('中'),輸出結(jié)果是20013。20013是什么呢,我們?cè)僭囋噃ex(ord('中')),輸出結(jié)果是'0x4e2d',也就是20013是我們?cè)谏衔囊娒媪藷o數(shù)次的x4e2d的十進(jìn)制值。這里說下hex,是用來轉(zhuǎn)換成十六進(jìn)制的函數(shù),學(xué)過單片機(jī)的人對(duì)hex肯定不會(huì)陌生。

最后的擴(kuò)展,在網(wǎng)上看到的他人的問題。我們寫下類似于'\u4e2d'的字符,Python3知道我們想表達(dá)什么。但是讓Python讀取某個(gè)文件的時(shí)候出現(xiàn)了'\u4e2d',是不是計(jì)算機(jī)就不認(rèn)識(shí)它了呢?后來下文有人給出了答案。如下:

import codecs

file = codecs.open( "a.txt", "r", "unicode-escape" )

u = file.read()

print(u)


本文題目:python重新編碼函數(shù) Python編碼問題
分享URL:http://weahome.cn/article/doohphi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部