Python編碼問題

默認(rèn)編碼

字符串

python2 文本字符串默認(rèn)編碼是ASCII,中文默認(rèn)UTF-8
python3 文本字符串默認(rèn)編碼是Unicode

解釋器

python2 解釋器編碼默認(rèn)是ASCII
python3 解釋器編碼默認(rèn)是UTF-8

encode\decode

非Unicode 進行 decode 返回Unicode
Unicode 進行 encode 返回非Unicode


寫入文件

"w"

python3

  • "w"只能寫Unicode

python2

  • "w" 方法可以寫入Unicode和非Unicode
  • "w" 方法如果寫入Unicode會自動轉(zhuǎn)成解釋器的默認(rèn)編碼。

想使用python2寫入中文
必須是Unicode的中文
1.修改解釋器編碼為utf-8,這樣就可以處理包含中文的Unicode字符串寫入了

# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
a = u"世界"
with open('utf8.txt','w') as f:
    f.write(a)

注意:使用這種方法請不要使用pycharm,原生python2.7中會有這個方法,但是pycharm把這個方法屏蔽了

  1. 使用codecs模塊寫入文件,將Unicode字符串按encoding參數(shù)指定的編碼寫入:
# coding:utf-8
import codecs
unicode_str = u"世界"
with codecs.open("hello.txt", "w", encoding="utf-8") as :
    f.write(unicode_str)

"w" 方法寫入非Unicode,英文會直接寫入,中文只能在使用上面的方法一才能寫入。
例如已經(jīng)將Unicode.decode("utf-8"),就寫入utf-8。


"wb"

python3

  • "wb" 方法只能寫入非Unicode

python2

  • "wb"方法只能寫入非Unicode字符串("utf-8"、"GBK"等)

讀取文件

"r"

  • python3 r 讀出來的是Unicode
  • python2 r讀出來的是非Unicode

"rb"

  • python3 rb 讀出來的非Unicode
  • python2 rb 讀出來的是非Unicode

查看系統(tǒng)默認(rèn)編碼

import sys
# 打印出系統(tǒng)默認(rèn)編碼方式
print(sys.getdefaultencoding())

修改默認(rèn)編碼

# 修改系統(tǒng)默認(rèn)編碼
sys.setdefaultencoding('utf8')

類Unicode字符串轉(zhuǎn)換成Unicode字符串

將一個類Unicode字符串(長得像Unicode,但是它是個普通字符串),解碼為真正的Unicode

# python2中
s = "\u4f60\u597d\u4e16\u75c"
# 這樣操作它就變成真正的Unicode
unicodee_str = s.decode("unicode-escape")
print(unicodee_str) # u"\u4f60\u597d\u4e16\u75c"

注意:不管python2還是python3 遇到類Unicode碼(類似于這種"\u4f60\u597d\u4e16\u75c")它其實是長得像Unicode碼的Unicode碼;
先變成非Unicode,之后再decode("unicode-escape"),可以將類Unicode變成Unicode碼。

Json化寫入文件

將字典json化保存成系統(tǒng)指定編碼
如果python2會將unicode字符串編碼成ascii保存成文件,這時候就需要兩步

  1. 指定編碼寫入
  2. json.dumps(字典,ensure_ascii=False)
# coding:utf-8
class TencentPipeline(object):
    def open_spider(self,spider):
    # 按指定編碼保存文件
        self.f = codecs.open("tencent.json", "w",encoding='utf-8')

    def process_item(self,item,spider):
        # ensure_ascii=False不以ascii編碼保存文件
        json_str = json.dumps(dict(item),ensure_ascii=False) + ',\n'
        self.f.write(json_str)
        return item

    def close_spider(self,spider):
        self.f.close()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 幾個基本概念 bit二進制位, 是計算機內(nèi)部數(shù)據(jù)儲存的最小單位,11010100是一個8位二進制數(shù)。一個二進制位只...
    西電大俠閱讀 3,590評論 1 8
  • 什么是編碼 任何一種語言、文字、符號等等,計算都是將其以一種類似字典的形式存起來的,比如最早的計算機系統(tǒng)將英文文字...
    隨風(fēng)化作雨閱讀 1,562評論 1 2
  • 寫python的過程中經(jīng)常出現(xiàn)各種蛋疼的編碼問題,于是通過上網(wǎng)查資料,自己做實驗,想徹底搞清楚這個問題。 編碼和解...
    allen哦閱讀 530評論 0 1
  • 繼上一篇文章字符集和編碼詳解總結(jié)了常見字符編碼后,這篇文章會對python中常見的編碼問題進行分析和總結(jié)。由于py...
    __七把刀__閱讀 2,911評論 0 6
  • 閱讀python源代碼的時候不難發(fā)現(xiàn)許多文件開頭都有這樣一行內(nèi)容: 如果想在python中使用中文,這樣的一行聲明...
    Fengya閱讀 777評論 0 50