標籤:utf8 可變 lse tmp www. com 出現 pyc 問題
最近在做這個新聞爬蟲進行文本分析,從網上down了一些爬蟲的代碼 代碼源用的是
https://jooop.github.io/2017/01/29/python3%E7%BD%91%E6%98%93%E7%88%AC%E8%99%AB/#1-%E6%A8%A1%E5%9D%97%E7%9A%84%E9%80%89%E6%8B%A9%E5%92%8C%E5%88%97%E8%A1%A8%E9%A1%B5%E9%9D%A2%E7%9A%84%E7%88%AC%E5%8F%96%EF%BC%9A
可以直接使用 python 2.7+mysql5.6+window7系統+pycharm(IDE)
因為爬蟲涉及到中文儲存到mysql資料庫,所以中間經曆了中文亂碼顯示,中文儲存到資料庫不能正常顯示,從python端列印出來的字元也不是中文顯示的問題
歸根揭底這都是編碼格式的問題。所以寫下來作為筆記咯,在資料圈混的人,哪能繞開編碼格式呢....
先說python端編碼問題:
Python2(包括Python26、Python27等)的字串通常包含str、unicode兩種類型,通常str的字串編碼方式由源碼檔案的編碼方式決定,目前使用的基本都是UTF-8的編碼格式,所以要在py檔案的頭部指定編碼格式:# -*- coding: utf-8 -*-
在Python程式內部,通常使用的字串為unicode編碼,這樣的字串字元是一種記憶體編碼格式,如果將這些資料存放區到檔案或是記錄日誌的時候,就需要將unicode編碼的字串轉換為特定字元集的儲存編碼格式。
那什麼是UNICODE、UTF-8呢?Unicode和UTF-8有什麼聯絡呢?
Unicode( 統一碼、萬國碼、單一碼)是電腦科學領域裡的一項業界標準,包括字元集、編碼方案等。Unicode 是為瞭解決傳統的字元編碼方案的局限而產生的,它為每種語言中的每個字元設定了統一併且唯一的 二進位編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。只要電腦上有 UNICODE 這種編碼系統,無論是全球哪種文字,只需要儲存檔案的時候,儲存成 UNICODE 編碼就可以被其他電腦正常解釋。
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,也是一種首碼碼,又稱萬國碼。
簡單來說,Unicode是一種概念,而UTF-8則是將unicode概念執行個體化。(老闆說,我們要搞大資料架構(此時這個就是概念老闆並不知道實現標準是啥對應unicode),程式員搞了個hadoop架構(UTF-8)就是大資料架構的實現)
以下是在python中實驗的code
ex1:
In[10]: "中文"
Out[10]:
‘\xe4\xb8\xad\xe6\x96\x87‘
這個例子直接輸入中文列印出來的utf-8編碼格式的值
- \x:只是 16 進位的意思,後邊跟兩位,則表示單位元組編碼;
ex2: 如果你想列印出來中文 必須在前面加print我不禁有些疑惑,why? 我的理解是如果不加print,python不認為你要求列印顯示,只是顯示一下資料,它就採用比較懶的方式直接顯示這個字在電腦中的編碼,如果你加了print,他就理解是你要求列印出來,列印出來就根據你這個實際代表的意思列印咯。前提是你的系統是UTF-8編碼格式的哦。如果不是utf-8的編碼格式,列印出來也是亂碼。更改編碼格式請見
In[11]: print "中文"
中文
In[12]: sys.getdefaultencoding()
Out[12]:
‘utf-8‘
Answer:Print列印顯示的過程
圖1. Print列印顯示過程
Python2.7中調用print列印var 變數時,作業系統會對var做一定的字元處理:如果var是str類型的變數,則直接將var變數交付給終端進行顯示;如果var變數是unicode類型,則作業系統首先將var編碼成str類型的對象(編碼格式取決於stdout的編碼格式),然後再交由終端進行顯示。在終端顯示時,如果str類型的變數的編碼方式和終端設定的編碼方式不一致,很可能會出現亂碼問題。
ex3、列表或字典中的中文處理
data = {"a":"hello","b":"中國"} #假設是utf-8的格式
這時我們用print直接輸出data, 或用str函數將data轉為字串。其中的中文是變成unicode的字元,如:
>>> data = {"a":"hello","b":"中國"}
>>> print data
{‘a‘: ‘hello‘, ‘b‘: ‘\xd6\xd0\xb9\xfa‘}
單獨輸出中文欄位沒問題,如
>>> print data[‘b‘]
中國
如果希望能正常的將整個字典輸出,可以利用json包的dump方法,如:
>>> data = {"a":"hello","b":"中國"}
>>> s = json.dumps(data,ensure_ascii=False);
>>> print s
{"a": "hello", "b": "中國"}
>>> print isinstance(s,str)
True
然後說一下這些資料如何正常的儲存到mysql中去
首先mysql要支援utf-8編碼儲存,需要去mysql安裝檔案中my.ini配置中進行配置
[client]
#password= your_password
port= 3306
socket= /tmp/mysql.sock
default-character-set=utf8
[mysqld]
port=3306
character-set-server=utf8
collation-server=utf8_general_ci
其次要確定你建立的表及欄位預設儲存也是utf-8的格式,具體查看和更改方式
https://www.cnblogs.com/wcwen1990/p/6917109.html 可以參考這個網頁
然後你就需要將utf-8的字元直接按其本身的字元儲存而不是用電腦預設進位位元組儲存,此時你可以通過
str.decode("unicode_escape") 實現
是我沒有進行decode轉換,直接儲存進去的就是unicode編碼檔案
加了decode("unicode_escape")之後的儲存就直接是正常的文字了
python mysql utf-8 latin