簡(jiǎn)單解決Python文件中文編碼問(wèn)題
讀寫中文
需要讀取utf-8編碼的中文文件,先利用sublime text軟件將它改成無(wú)DOM的編碼,然后用以下代碼:
with codecs.open(note_path, 'r+','utf-8') as f: line=f.readline() print line
這樣就可以正確地讀出文件里面的中文字符了。
同樣的,如果要在創(chuàng)建的文件中寫入中文,最好也和上面差不多:
with codecs.open(st,'a+','utf-8') as book_note: book_note.write(st)
創(chuàng)建中文文件
然后以讀出的字符為文件名,創(chuàng)建文件。
如果直接用上面讀出來(lái)的字符串創(chuàng)建文件,則會(huì)出現(xiàn):
st=digest_path+"\\"+onenote[0]+".txt" print st with open(st,'a+') as book_note:

經(jīng)過(guò)調(diào)試,應(yīng)該是最后一個(gè)換行符的問(wèn)題,在生成名字的時(shí)候,將字符trip一下,就能夠得到文件:
st=digest_path+"\\"+onenote[0].strip()+".txt"
中文編碼問(wèn)題是用中文的程序員經(jīng)常頭大的問(wèn)題,在python下也是如此,那么應(yīng)該怎么理解和解決python的編碼問(wèn)題呢?
我們要知道python內(nèi)部使用的是unicode編碼,而外部卻要面對(duì)千奇百怪的各種編碼,比如作為中國(guó)程序經(jīng)常要面對(duì)的gbk,gb2312,utf8等,那這些編碼是怎么轉(zhuǎn)換成內(nèi)部的unicode呢?
首先我們先看一下源代碼文件中使用字符串的情況。源代碼文件作為文本文件就必然是以某種編碼形式存儲(chǔ)代碼的,python默認(rèn)會(huì)認(rèn)為源代碼文件是asci編碼,比如說(shuō)代碼中有一個(gè)變量賦值:
s1='a' print s1
python認(rèn)為這個(gè)'a'就是一個(gè)asci編碼的字符。在僅僅使用英文字符的情況下一切正常,但是如果用了中文,比如:
s1='哈' print s1
這個(gè)代碼文件被執(zhí)行時(shí)就會(huì)出錯(cuò),就是編碼出了問(wèn)題。python默認(rèn)將代碼文件內(nèi)容當(dāng)作asci編碼處理,但asci編碼中不存在中文,因此拋出異常。
解決問(wèn)題之道就是要讓python知道文件中使用的是什么編碼形式,對(duì)于中文,可以用的常見(jiàn)編碼有utf-8,gbk和gb2312等。只需在代碼文件的最前端添加如下:
# -*- coding: utf-8 -*-
這就是告知python我這個(gè)文件里的文本是用utf-8編碼的,這樣,python就會(huì)依照utf-8的編碼形式解讀其中的字符,然后轉(zhuǎn)換成unicode編碼內(nèi)部處理使用。
不過(guò),如果你在Windows控制臺(tái)下運(yùn)行此代碼的話,雖然程序是執(zhí)行了,但屏幕上打印出的卻不是哈字。這是由于python編碼與控制臺(tái)編碼的不一致造成的。Windows下控制臺(tái)中的編碼使用的
是gbk,而在代碼中使用的utf-8,python按照utf-8編碼打印到gbk編碼的控制臺(tái)下自然就會(huì)不一致而不能打印出正確的漢字。
解決辦法一個(gè)是將源代碼的編碼也改成gbk,也就是代碼第一行改成:
# -*- coding: gbk -*-
另一種方法是保持源碼文件的utf-8不變,而是在'哈'前面加個(gè)u字,也就是:
s1=u'哈' print s1
這樣就可以正確打印出'哈'字了。
這里的這個(gè)u表示將后面跟的字符串以u(píng)nicode格式存儲(chǔ)。python會(huì)根據(jù)代碼第一行標(biāo)稱的utf-8編碼識(shí)別代碼中的漢字'哈',然后轉(zhuǎn)換成unicode對(duì)象。如果我們用type查看一下'哈'的數(shù)據(jù)類型type(‘哈'),會(huì)得到<type ‘str'>,而type(u'哈'),則會(huì)得到<type ‘unicode'>,也就是在字符前面加u就表明這是一個(gè)unicode對(duì)象,這個(gè)字會(huì)以u(píng)nicode格式存在于內(nèi)存中,而如果不加u,表明這僅僅是一個(gè)使用某種編碼的字符串,編碼格式取決于python對(duì)源碼文件編碼的識(shí)別,這里就是utf-8。
Python在向控制臺(tái)輸出unicode對(duì)象的時(shí)候會(huì)自動(dòng)根據(jù)輸出環(huán)境的編碼進(jìn)行轉(zhuǎn)換,但如果輸出的不是unicode對(duì)象而是普通字符串,則會(huì)直接按照字符串的編碼輸出字符串,從而出現(xiàn)上面的現(xiàn)象。
使用unicode對(duì)象的話,除了這樣使用u標(biāo)記,還可以使用unicode類以及字符串的encode和decode方法。
unicode類的構(gòu)造函數(shù)接受一個(gè)字符串參數(shù)和一個(gè)編碼參數(shù),將字符串封裝為一個(gè)unicode,比如在這里,由于我們用的是utf-8編碼,所以u(píng)nicode中的編碼參數(shù)使用'utf-8′將字符封裝為
unicode對(duì)象,然后正確輸出到控制臺(tái):
s1=unicode(‘哈', ‘utf-8′) print s1
另外,用decode函數(shù)也可以將一個(gè)普通字符串轉(zhuǎn)換為unicode對(duì)象。很多人都搞不明白python字符串的decode和encode函數(shù)都是什么意思。這里簡(jiǎn)要說(shuō)明一下。
decode是將普通字符串按照參數(shù)中的編碼格式進(jìn)行解析,然后生成對(duì)應(yīng)的unicode對(duì)象,比如在這里我們代碼用的是utf-8,那么把一個(gè)字符串轉(zhuǎn)換為unicode就是如下形式:
s2='哈'.decode(‘utf-8′)
這時(shí),s2就是一個(gè)存儲(chǔ)了'哈'字的unicode對(duì)象,其實(shí)就和unicode(‘哈', ‘utf-8′)以及u'哈'是相同的。
那么encode正好就是相反的功能,是將一個(gè)unicode對(duì)象轉(zhuǎn)換為參數(shù)中編碼格式的普通字符,比如下面代碼:
s3=unicode(‘哈', ‘utf-8′).encode(‘utf-8′)
s3現(xiàn)在又變回了utf-8的'哈'。
- python編碼總結(jié)(編碼類型、格式、轉(zhuǎn)碼)
- Python轉(zhuǎn)碼問(wèn)題的解決方法
- python使用chardet判斷字符串編碼的方法
- python實(shí)現(xiàn)unicode轉(zhuǎn)中文及轉(zhuǎn)換默認(rèn)編碼的方法
- Python中使用不同編碼讀寫txt文件詳解
- python將圖片文件轉(zhuǎn)換成base64編碼的方法
- python3編碼問(wèn)題匯總
- python實(shí)現(xiàn)中文轉(zhuǎn)換url編碼的方法
- 跟老齊學(xué)Python之坑爹的字符編碼
- Python設(shè)置默認(rèn)編碼為utf8的方法
- 學(xué)習(xí)python處理python編碼問(wèn)題
- 詳解Python中使用base64模塊來(lái)處理base64編碼的方法
- python輕松實(shí)現(xiàn)代碼編碼格式轉(zhuǎn)換
- python自然語(yǔ)言編碼轉(zhuǎn)換模塊codecs介紹
- 使用python的chardet庫(kù)獲得文件編碼并修改編碼
- Python 十六進(jìn)制整數(shù)與ASCii編碼字符串相互轉(zhuǎn)換方法
- Python使用email模塊對(duì)郵件進(jìn)行編碼和解碼的實(shí)例教程
- Python處理JSON時(shí)的值報(bào)錯(cuò)及編碼報(bào)錯(cuò)的兩則解決實(shí)錄
- Python字符編碼轉(zhuǎn)碼之GBK,UTF8互轉(zhuǎn)
相關(guān)文章
Python內(nèi)置函數(shù)Type()函數(shù)一個(gè)有趣的用法
這篇文章主要介紹了Python內(nèi)置函數(shù)Type()函數(shù)一個(gè)有趣的用法,本文講解的是個(gè)人發(fā)現(xiàn)在的一個(gè)有趣的用法,注意這種寫法會(huì)導(dǎo)致代碼很難讀,需要的朋友可以參考下2015-02-02
Tensorflow tf.nn.atrous_conv2d如何實(shí)現(xiàn)空洞卷積的
這篇文章主要介紹了Tensorflow tf.nn.atrous_conv2d如何實(shí)現(xiàn)空洞卷積的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
python中使用sys模板和logging模塊獲取行號(hào)和函數(shù)名的方法
這篇文章主要介紹了python中使用sys模板和logging模塊獲取行號(hào)和函數(shù)名的方法,需要的朋友可以參考下2014-04-04
Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)并生成exe可執(zhí)行文件詳解流程
由于Python都會(huì)了,學(xué)校教的確實(shí)基礎(chǔ),平時(shí)就沒(méi)怎么去上課,讓美女老師天天腦殼痛,這不快畢業(yè)了,讓我做一個(gè)學(xué)生管理系統(tǒng)出來(lái),還要打包成exe發(fā)給她,她就不追究我不上課的問(wèn)題了2022-01-01
提升Python項(xiàng)目整潔度使用import?linter實(shí)例探究
在復(fù)雜的Python項(xiàng)目中,良好的代碼組織結(jié)構(gòu)是維護(hù)性和可讀性的關(guān)鍵,本文將深入研究?import-linter?工具,它是一個(gè)強(qiáng)大的靜態(tài)分析工具,旨在優(yōu)化項(xiàng)目的模塊導(dǎo)入,提高代碼質(zhì)量和可維護(hù)性2024-01-01

