讀寫中文
需要讀取utf-8編碼的中文文件,先利用sublime text軟件將它改成無DOM的編碼,然后用以下代碼:
with codecs.open(note_path, 'r+','utf-8') as f: line=f.readline() print line
這樣就可以正確地讀出文件里面的中文字符了。
同樣的,如果要在創建的文件中寫入中文,最好也和上面差不多:
with codecs.open(st,'a+','utf-8') as book_note: book_note.write(st)
創建中文文件
然后以讀出的字符為文件名,創建文件。
如果直接用上面讀出來的字符串創建文件,則會出現:
st=digest_path+"\\"+onenote[0]+".txt" print st with open(st,'a+') as book_note:
經過調試,應該是最后一個換行符的問題,在生成名字的時候,將字符trip一下,就能夠得到文件:
st=digest_path+"\\"+onenote[0].strip()+".txt"
中文編碼問題是用中文的程序員經常頭大的問題,在python下也是如此,那么應該怎么理解和解決python的編碼問題呢?
我們要知道python內部使用的是unicode編碼,而外部卻要面對千奇百怪的各種編碼,比如作為中國程序經常要面對的gbk,gb2312,utf8等,那這些編碼是怎么轉換成內部的unicode呢?
首先我們先看一下源代碼文件中使用字符串的情況。源代碼文件作為文本文件就必然是以某種編碼形式存儲代碼的,python默認會認為源代碼文件是asci編碼,比如說代碼中有一個變量賦值:
s1='a' print s1
python認為這個'a'就是一個asci編碼的字符。在僅僅使用英文字符的情況下一切正常,但是如果用了中文,比如:
s1='哈' print s1
這個代碼文件被執行時就會出錯,就是編碼出了問題。python默認將代碼文件內容當作asci編碼處理,但asci編碼中不存在中文,因此拋出異常。
解決問題之道就是要讓python知道文件中使用的是什么編碼形式,對于中文,可以用的常見編碼有utf-8,gbk和gb2312等。只需在代碼文件的最前端添加如下:
# -*- coding: utf-8 -*-
這就是告知python我這個文件里的文本是用utf-8編碼的,這樣,python就會依照utf-8的編碼形式解讀其中的字符,然后轉換成unicode編碼內部處理使用。
不過,如果你在Windows控制臺下運行此代碼的話,雖然程序是執行了,但屏幕上打印出的卻不是哈字。這是由于python編碼與控制臺編碼的不一致造成的。Windows下控制臺中的編碼使用的
是gbk,而在代碼中使用的utf-8,python按照utf-8編碼打印到gbk編碼的控制臺下自然就會不一致而不能打印出正確的漢字。
解決辦法一個是將源代碼的編碼也改成gbk,也就是代碼第一行改成:
# -*- coding: gbk -*-
另一種方法是保持源碼文件的utf-8不變,而是在'哈'前面加個u字,也就是:
s1=u'哈' print s1
這樣就可以正確打印出'哈'字了。
這里的這個u表示將后面跟的字符串以unicode格式存儲。python會根據代碼第一行標稱的utf-8編碼識別代碼中的漢字'哈',然后轉換成unicode對象。如果我們用type查看一下'哈'的數據類型type(‘哈'),會得到
Python在向控制臺輸出unicode對象的時候會自動根據輸出環境的編碼進行轉換,但如果輸出的不是unicode對象而是普通字符串,則會直接按照字符串的編碼輸出字符串,從而出現上面的現象。
使用unicode對象的話,除了這樣使用u標記,還可以使用unicode類以及字符串的encode和decode方法。
unicode類的構造函數接受一個字符串參數和一個編碼參數,將字符串封裝為一個unicode,比如在這里,由于我們用的是utf-8編碼,所以unicode中的編碼參數使用'utf-8′將字符封裝為
unicode對象,然后正確輸出到控制臺:
s1=unicode(‘哈', ‘utf-8′) print s1
另外,用decode函數也可以將一個普通字符串轉換為unicode對象。很多人都搞不明白python字符串的decode和encode函數都是什么意思。這里簡要說明一下。
decode是將普通字符串按照參數中的編碼格式進行解析,然后生成對應的unicode對象,比如在這里我們代碼用的是utf-8,那么把一個字符串轉換為unicode就是如下形式:
s2='哈'.decode(‘utf-8′)
這時,s2就是一個存儲了'哈'字的unicode對象,其實就和unicode(‘哈', ‘utf-8′)以及u'哈'是相同的。
那么encode正好就是相反的功能,是將一個unicode對象轉換為參數中編碼格式的普通字符,比如下面代碼:
s3=unicode(‘哈', ‘utf-8′).encode(‘utf-8′)
s3現在又變回了utf-8的'哈'。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
