python 用shelve讀取.dat文件中文亂碼問題

  1. 「得到的結果是'xb2xe2xcaxd4,並不是我想要的中文」 =》其實,你看到的'xb2xe2xcaxd4『,版就已經是你想要的中文了。只不過是GBK編碼的權,所以顯示出來的是'測試'這兩個中文字元所對應的GBK編碼的內部的值而已

    如果你想要顯示出中文字元,而非內部值的話,可以,先將其轉換為Unicode,就可以看到中文了:

    decodedName=Database['name'].decode("GBK")
    print"decodedName=",decodedName#decodedName=測試


  2. 註:

    1.不要用那個IDLE,不好用,容易讓你誤解。

    2.在直接在cmd下測試即可。

  3. 更多的,極其詳盡的解釋,我專門為你寫了教程了。你一看就懂了:

    【整理】Python中實際上已經得到了正確的Unicode或某種編碼的字元,但是看起來或列印出來卻是亂碼

    (google搜標題即可找到我的帖子了)

❷ python顯示亂碼

多次被python的編碼/亂碼問題困擾,相信pythoner們都被困擾過,網上鋪天蓋地的資料太多也參差不齊,就整理了下。本文從使用的角度系統總結了python編碼相關的一些概念,將本文的例子玩一遍,基本上對python的編碼問題就清楚了。
首先明確幾個概念:
位元組流:以utf8/gbk等編碼編碼的位元組流。
unicode對象:python代碼中,a=u'中國', 或者a='中國'.decode()的結果。
terminal用於顯示字元的編碼:將一個用utf8/gbk編碼的位元組流通過terminal指定的編碼,去查找對應的字元顯示出來。
locale:linux下,Locale 是軟體在運行時的語言環境, 它包括語言(Language), 地域 (Territory) 和字元集(Codeset)。一個locale的書寫格式為: 語言[_地域[.字元集]]. 所以說呢,locale總是和一定的字元集相聯系的。比如:zh_CN.GB2312
編碼轉換原則:unicode是」中介」,任何編碼之間轉換都需要先decode()到unicode。
針對python,先把結論放在前面,三點:
#coding:utf-8 #.py文件是什麼編碼就需要告訴python用什麼編碼去讀取這個.py文件。
sys.stdout.encoding,默認就是locale的編碼,print會用sys.stdout.encoding去encode()成位元組流,交給terminal顯示。所以locale需要與terminal一致,才能正確print列印出中文。
sys.setdefaultencoding(『utf8』),用於指定str.encode() str.decode()的默認編碼,默認是ascii。
對編碼字元串a,代碼中可以直接寫a.encode(「gbk」),但事實上內部自動先通過defaultencoding 去decode成unicode之後再encode()的。
str(xxx)應該也是用這個去編碼的。
'ascii' codec can't encode characters in position 7-8: ordinal not in range(128)print的時候出現這個錯誤一般可以使用這個方案去處理。
為了避免代碼中到處都要去encode(「xxx」),還有可能不同的地方寫得不一樣帶來不一致的情況,推薦使用這個:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
例子1:
在python中,unicode vs 位元組流:位元組流可以從unicode encode得到,unicode可以從utf8/gbk等編碼的位元組流decode得到。
分析下面這段代碼,終端/locale分別為不同編碼的情況:
#coding:utf-8 #由於.py文件是utf-8的,所以必須有這一句
import sys
import locale
import os
import codecs
reload(sys)
print sys.getdefaultencoding() + " - sys.getdefaultencoding()"
sys.setdefaultencoding('utf8') #影響encode()
print sys.getdefaultencoding() + " - sys.getdefaultencoding()"
print sys.stdout.encoding + " - sys.stdout.encoding:"
#sys.stdout = codecs.getwriter('utf8')(sys.stdout) #影響print
print sys.stdout.encoding + " - sys.stdout.encoding:"
u = u'中國'
print u + " - u"
a = '中國'
print a + " - a"
print a.decode('utf-8') + " - a.decode('utf-8')"
print a.decode('utf-8').encode('gbk') + " - a.decode('utf-8').encode('gbk')"
print a.decode('utf-8').encode('utf-8') + " - a.decode('utf-8').encode('utf-8')"
print a.decode('utf-8').encode() + " - a.decode('utf-8').encode()"
print (sys.stdout.encoding) + " - (sys.stdout.encoding)"
print (sys.stdout.isatty())
print (locale.getpreferredencoding())
print (sys.getfilesystemencoding())
—終端為UTF-8,locale為zh_CN.GBK—————–
ascii - sys.getdefaultencoding()
utf8 - sys.getdefaultencoding()
GBK - sys.stdout.encoding:
GBK - sys.stdout.encoding:
?й? - u
中國 - a
?й? - a.decode('utf-8')
?й? - a.decode('utf-8').encode('gbk')
中國 - a.decode('utf-8').encode('utf-8')
中國 - a.decode('utf-8').encode()
GBK - (sys.stdout.encoding)
True
GBK
utf-8
—終端為UTF-8,locale為zh_CN.UTF-8—————–
ascii - sys.getdefaultencoding()
utf8 - sys.getdefaultencoding()
UTF-8 - sys.stdout.encoding:
UTF-8 - sys.stdout.encoding:
中國 - u
中國 - a
中國 - a.decode('utf-8')
?й? - a.decode('utf-8').encode('gbk')
中國 - a.decode('utf-8').encode('utf-8')
中國 - a.decode('utf-8').encode()
UTF-8 - (sys.stdout.encoding)
True
UTF-8
utf-8
—終端為GBK,locale為zh_CN.GBK—————–
ascii - sys.getdefaultencoding()
utf8 - sys.getdefaultencoding()
GBK - sys.stdout.encoding:
GBK - sys.stdout.encoding:
中國 - u
涓???? - a
中國 - a.decode('utf-8')
中國 - a.decode('utf-8').encode('gbk')
涓???? - a.decode('utf-8').encode('utf-8')
涓???? - a.decode('utf-8').encode()
GBK - (sys.stdout.encoding)
True
GBK
utf-8
—終端為GBK,locale為zh_CN.UTF-8—————–
ascii - sys.getdefaultencoding()
utf8 - sys.getdefaultencoding()
UTF-8 - sys.stdout.encoding:
UTF-8 - sys.stdout.encoding:
涓???? - u
涓???? - a
涓???? - a.decode('utf-8')
中國 - a.decode('utf-8').encode('gbk')
涓???? - a.decode('utf-8').encode('utf-8')
涓???? - a.decode('utf-8').encode()
UTF-8 - (sys.stdout.encoding)
True
UTF-8
utf-8
例子1總結,對print而言:
unicode的數據如果要顯示正常,必須終端與locale一致。sys.stdout.encoding這個值應該來自locale,print會以sys.stdout.encoding去encode並輸出到位元組流。
encode為終端編碼的位元組流就能顯示正常,無論locale是啥。
最終是terminal通過terminal配置的編碼規則去解碼成對應的字元並顯示出來。
例子2:
關於sys.setdefaultencoding(『utf8』)的例子:
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
print sys.getdefaultencoding() + " - sys.getdefaultencoding()"
a = '中國'
print a + " - a"
print a.encode("gbk") #並不是直接從utf8的位元組流轉化到gbk的,而是通過defaultencoding decode之後才轉的。
print a.decode() #使用默認的defaultencoding
print a.encode() #使用默認的defaultencoding
關於str()和repr()
str()是對各種類型轉化成str,如果本來是encoded字元串,則不變,如果為unicode,會encode()
repr()對字元串是將位元組流出二進制的值以16進制轉化為可見字元。
測試環境locale為GBK
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
a = u'中國'
print a
print str(a)
print repr(a)
print repr(a.encode("utf-8"))
print repr(a.encode("gbk"))
中國
涓????
u'\u4e2d\u56fd'
'\xe4\xb8\xad\xe5\x9b\xbd'
'\xd6\xd0\xb9\xfa'
再深挖下去,還有repr()和eval()的關系,就不深挖了。
關於終端和伺服器的編碼
另外補充一些關於終端和伺服器編碼的結論:
1. 對mac iterm2,如果server的locale與mac本地終端的locale一致,才能保證server端與本地的表現一致。
2. cat a.py #就把文件顯示出來,就是給terminal一串位元組流。terminal根據設置的終端編碼規則來顯示字元。所以只要文件編碼與terminal一致即可,與locale無關。
3. cat a.txt > b.txt #無論locale怎麼樣,只跟a.txt原來的編碼相關
4. echo 「中國年過」 > a.txt #這個情況下,只有terminal與locale的編碼一致,你才能在終端shell打出正確的中文~~~所以a.txt與兩者都會一致

❸ 為什麼python文件打開有亂碼

腳本開頭加 # -*- coding: utf-8 -*-用文本編輯器 打開腳本文件,將腳本文件的編碼 設置成 ANSI,保存腳本,在 IDLE 中運行,查看結果正常;# -*- coding: utf-8 -*-#這是一個注釋的練習print "這是我的第一個學習練習。Python 2"測試結果,中文顯示正常。

❹ python下讀取種子文件列表中的名字,獲取到的信息是亂碼,使用bencode來讀取的

使用:chardet 模塊,可以檢測你的內容是什麼編碼。然後再根據檢測結果來解碼。

❺ python中讀取文件(路徑含中文)出現亂碼問題。

沒有Python3 。

你試一下

path='Py....'#下面添加一行
path=path.decode('gbk')

❻ python 讀取再寫入就亂碼

無論你原來是什麼編碼, 先按utf-8 encode再按gb18030 decode都不是正確的打開方式.
如果原來是utf-8, 直接讀出來.decode("utf8"). 在寫的時候再.encode("utf8")即可.

❼ 使用python打開一個txt文件,逐行讀取,但是txt本身含有亂碼,報錯。有什麼方法可以忽略這些錯誤繼續讀

大約抄就是這樣。沒有調試過。

fp=fopen("xxxx.txt","rt")
en=0
while True:
try:
eachline=fp.readline()
except:
en+=1
if en>10000:break #如果出錯1萬次就不再讀了。防死循環
continue
if x=="":break
print eachline
fp.close()

❽ python,打開文件都是亂碼

現在為什麼還要用2啊,2馬上就不會維護了啊,為什麼會有python3呢,就是處理這些遺留問題的啊啊

❾ python讀取中文目錄出現亂碼

Windows 下文件路徑的中文編碼是 GB2312/CP396,而 Python 設置編碼為 UTF-8 ...
所以應當對每一個文件路徑做編碼轉換 很簡單版 就是先按權照 GB2312 decode 然後再按照 UTF-8 encode..

❿ python中文顯示亂碼,已經在開頭有了coding: utf-8

亂碼原因:
因為你的文件聲明為 utf-8,並且也應該是用 utf-8 的編碼保存的源文件。但是 windows 的本地回默認編碼是 cp936,也就答是 gbk 編碼,所以在控制台直接列印 utf-8 的字元串當然是亂碼了。

解決方法:

py文件用記事本打開,另存為utf-8格式即可