欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

快速入手Python字符編碼

 更新時間:2016年08月03日 17:07:17   作者:LittleCoder  
本文不談復(fù)雜的理論,就經(jīng)驗教大家字符處理八字真言:確定編碼,同類交互。教大家快速戰(zhàn)勝Python字符編碼。

前言

對于很多接觸Python的人而言,字符的處理和語言整體的溫順可靠相比顯得格外桀驁不馴難以駕馭。

文章針對Python 2.7,主要因為3對的編碼已經(jīng)有了很大的改善并且實際原理一樣,更改一下操作命令即可。

了解完本文,你可以輕松解決文字處理,特殊平臺(Windows?)下的編碼,爬蟲編碼等問題。

閱讀建議

本文分為如下幾個部分:

    1.原理

    2.具體操作

    3.建議的使用習慣

    4.疑難問題解答

如果想要了解我給出的使用習慣,可以直接跳到建議的使用習慣。

如果只想要解決相關(guān)問題可以直接跳到疑難問題解答。

希望本文能夠幫到你。

原理

為了理解方便,這里不談理論只做類比,具體想要進一步了解各種編碼的理論的百度一下好了。

首先說一下我們?yōu)槭裁磿龅礁魇礁鳂拥木幋a問題:

    1.因為我們沒有統(tǒng)一編碼

    2.因為我們沒有用對命令(傳對數(shù)據(jù))

再說一下編碼是什么,Python的編碼看似復(fù)雜,實際上可以看做只有兩類編碼:Unicode,二進制

     1.Unicode 相信都很熟悉:,就是\u0000這樣的

     2.二進制編碼也很簡單,就是\x00\x00這樣的,平??吹降?code>utf-8,cp936都是二進制編碼

     3.二進制編碼是具象的10001100原樣就可以存儲,而Unicode是抽象的,不能這樣存

#coding=utf8

# Unicode編碼演示
print('Unicode:')
print(repr(u'Unicode編碼'))`

# 二進制編碼演示
print(u'二進制編碼:')
print(repr('Unicode編碼'))`

# 只是看個樣子,代碼不必去深究

再說怎么做,就是只有同種編碼之間才可以操作

舉個簡單的類比

     就把一串數(shù)據(jù)比為烤鴨,我們作為人和鴨子不同種看待烤鴨的態(tài)度完全不一樣。

     我們看到的是晚上的配菜,鴨子看到的是自己二舅。

     那么我在逛烤鴨店的時候用錯編碼就會報錯。

     因為我在烤鴨店看到了滿世界的二舅。

這里說的同種就是我們熟悉的各種編碼方式:utf-8,unicode,ucs-bom

這也就是編碼問題的核心,非常重要。

最后說一下Python的環(huán)境

    1.本身代碼是用Ascii解碼的,文件里有Ascii無法解碼的內(nèi)容的話要告知Python怎么解碼

    2.內(nèi)部大量命令都是默認接受Unicode

# 告知的命令就是下面這一行,刪掉就會報錯
#coding=utf8
print(u'測試編碼')

具體操作

拿到各種編碼的內(nèi)容自然是不用說,那么如果我們想要自己構(gòu)造怎么做呢,看下面:

#coding=utf8

# 字符串前面加u會默認構(gòu)造出Unicode的字符串
unicodeString = u'Unicode字符串'

# 字符串前面什么都不加會構(gòu)造出默認編碼(首行限定了現(xiàn)在的utf8)的字符串
utf8String = 'Utf-8字符串'

# 當然,沒有首行,默認的編碼是Ascii

那么他們之間怎么轉(zhuǎn)換呢,同樣很簡單:

# 接上一段程序

# Unicode轉(zhuǎn)化為二進制編碼中的一種:utf8
unicodeString.encode('utf8')

# 二進制編碼根據(jù)自己的編碼種類轉(zhuǎn)化為Unicode
utf8String.decode('utf8')

# 如果二進制編碼中混進了奇怪的東西可以根據(jù)需求用特殊的decode策略
print(repr('u8字\x00符串'.decode('utf8', 'replace')))

那么怎么樣會出現(xiàn)問題呢:

# 接上一段程序

# 如果我們把他們轉(zhuǎn)化成同樣的編碼方式就可以操作(例如相加)
print(repr(unicodeString + utf8String.decode('utf8')))
print(repr(unicodeString.encode('utf8') + utf8String))

# 但如果不轉(zhuǎn)化,當然就會出現(xiàn)滿世界的烤鴨二舅啦
unicodeString + utf8String

# 所以另一方面也發(fā)現(xiàn),編碼轉(zhuǎn)換是需要我們告訴程序怎么做的
# 所有`decode`操作都會生成Unicode編碼,這是為了方便我之前說的大量接受Unicode的內(nèi)部命令

所以我們需要確定程序使用的編碼,這是我們需要告訴程序的東西

    1.一方面在操作字符串的時候確定是同種編碼

    2.另一方面在使用非自己寫的命令時,一般使用Unicode,或者使用接收二進制編碼的命令

#coding=utf8
# 這里拿寫入文件舉例

# 一般使用Unicode
with open('Unicode.txt', 'w') as f: f.write(u'Unicode測試')

# 或者使用接收二進制編碼的命令
with open('Utf8.txt', 'wb') as f: f.write('Utf8測試')

# 你可以反過來做個測試,自然會報錯
# 二進制的命令方便了在不知道怎么解碼的情況下也能進行操作(寫入文件)

我建議的使用習慣

相信到這里我已經(jīng)把我對于編碼的理解講完了。

我們?yōu)槭裁磿龅礁魇礁鳂拥木幋a問題:

    1.因為我們沒有統(tǒng)一編碼

    2.因為我們沒有用對命令(傳對數(shù)據(jù))

所以這里再重申一下八字真言:確定編碼,同類交互

    1.碰到問題,問一下自己,我現(xiàn)在是哪種編碼

    2.同一種編碼才能交互,那我應(yīng)該是哪種編碼

這里給出我的使用習慣:

    1.確定一種內(nèi)部編碼

    2.內(nèi)部編碼的選擇優(yōu)先級如下:程序必須使用的編碼、第三方包使用的編碼、你喜歡的編碼、Unicode

    3.在輸出時再更改到特定的編碼

記得在開始整個程序之前確定內(nèi)部的編碼,否則編碼一團糟會產(chǎn)生很多不必要的bug。

不要迷信內(nèi)部Unicode,例如Evernote開發(fā)就應(yīng)該根據(jù)第三方包使用的Utf8確定內(nèi)部編碼。

疑難問題解答

編碼識別

說了要確定編碼,那么拿到一串二進制要怎么確定編碼呢?

最簡單的方法是chardet:(需要安裝)

python -m pip install chardet

使用非常簡單:

#coding=utf8

from chardet import detect
print(detect('這是一串utf8的測試字符'))

# 結(jié)果:`{'confidence': 0.99, 'encoding': 'utf-8'}`

另外例如抓取網(wǎng)站,那么頭文件中很有可能有提示如何解碼,記得不要忘記了。

編碼轉(zhuǎn)換

很可能因為字符串中參雜了奇怪的東西,導(dǎo)致即使編碼種類正確,依舊無法解碼。

我知道我之前講過了,但可能有人直接跳疑難問題解答嘛。

這里可以使用decode的第二個參數(shù):

#coding=utf8

# 字符串中混進了\x00
rubbishUtf8String = 'Utf-8字\x00符串'

print(repr(rubbishUtf8String.decode('utf8', 'replace')))

print(repr(rubbishUtf8String.decode('utf8', 'ignore')))

特殊平臺下編碼

很多人都說Windows是個坑,即使在Python 3下面也一樣。

因為中文文件名出來都是亂碼。

這里使用一個取巧的方法:平臺編碼再特殊,起碼命令行讀取和創(chuàng)建一個文件夾不會出亂碼吧。

import sys, os

for folder in os.walk('.').next()[1]:
  print(folder.decode(sys.stdin.encoding))

同樣的輸入輸出也可以這樣做優(yōu)化:

import sys

def sys_print(msg):
  print(msg.encode(sys.stdin.encoding))

def sys_input(msg):
  return raw_input(msg.encode(sys.stdin.encoding)).decode(sys.stdin.encoding)

文件寫入

如果抓下來一個內(nèi)容不知道怎么解碼,但還是想要寫入文件怎么辦

寫入文件的時候制定用二進制命令即可:

#coding=utf8
import urllib

with open('Utf8.txt', 'wb') as f: f.write('Utf8測試')

# 比如抓了個網(wǎng)頁,不知道編碼也可以寫入文件進行一系列操作

content = urllib.urlopen('http://www.baidu.com').read()
with open('baidu.txt', 'wb') as f: f.write(content)

裸Unicode字符

Unicode存成六個Ascii字符怎么辦?其實也可以decode

#coding=utf8
# 這是普通的Unicode
s = u'測'
for i in s: print(i)
print(repr(s))

# 這是裸Unicode,實際存成了六個Ascii
s = repr(s)[2:-1]
for i in s: print(i)
print(repr(s))

# 轉(zhuǎn)化其實也很簡單
s = s.decode('unicode-escape')
for i in s: print(i)
print(repr(s))

總結(jié)

以上就是詳細介紹Python字符編碼的全部內(nèi)容,希望讀完這篇文章能對大家能有幫助,有什么不足之處萬望指正,希望大家多多支持腳本之家。

相關(guān)文章

  • python格式化輸出%s與format()的用法對比

    python格式化輸出%s與format()的用法對比

    這篇文章主要為大家介紹了python格式化輸出%s與format()的用法對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • python 解決數(shù)據(jù)庫寫入時float自動變?yōu)檎麛?shù)的問題

    python 解決數(shù)據(jù)庫寫入時float自動變?yōu)檎麛?shù)的問題

    這篇文章主要介紹了python 解決數(shù)據(jù)庫寫入時float自動變?yōu)檎麛?shù)的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • django rest framework vue 實現(xiàn)用戶登錄詳解

    django rest framework vue 實現(xiàn)用戶登錄詳解

    這篇文章主要介紹了django rest framework vue 實現(xiàn)用戶登錄詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Python求解平方根的方法

    Python求解平方根的方法

    這篇文章主要介紹了Python求解平方根的方法,涉及Python數(shù)學運算的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • python鏈接sqlite數(shù)據(jù)庫的詳細代碼實例

    python鏈接sqlite數(shù)據(jù)庫的詳細代碼實例

    SQLite數(shù)據(jù)庫是一款非常小巧的嵌入式開源數(shù)據(jù)庫軟件,也就是說沒有獨立的維護進程,所有的維護都來自于程序本身,它是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它的設(shè)計目標是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低
    2021-09-09
  • python編程通過蒙特卡洛法計算定積分詳解

    python編程通過蒙特卡洛法計算定積分詳解

    這篇文章主要介紹了python編程通過蒙特卡洛法計算定積分詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • python中的flask框架Jinja?模板入門教程

    python中的flask框架Jinja?模板入門教程

    這篇文章主要介紹了?python中的flask框架Jinja?模板入門,Jinja?模板其實是?html?文件,一般情況下放在?Flask?工程的?/templates?目錄下,對python?flask?Jinja?模板相關(guān)知識感興趣的朋友一起看看吧
    2022-04-04
  • Flask框架使用DBUtils模塊連接數(shù)據(jù)庫操作示例

    Flask框架使用DBUtils模塊連接數(shù)據(jù)庫操作示例

    這篇文章主要介紹了Flask框架使用DBUtils模塊連接數(shù)據(jù)庫操作,結(jié)合實例形式較為詳細的分析了flask框架使用DBUtils模塊連接數(shù)據(jù)庫的常見操作技巧與相關(guān)注意事項,需要的朋友可以參考下
    2018-07-07
  • Python全景系列之模塊與包全面解讀

    Python全景系列之模塊與包全面解讀

    這篇文章將帶大家深入探討Python模塊與包的基本概念,使用方法以及其在實際項目中的應(yīng)用,同時也會揭示一些鮮為人知,卻又實用的技術(shù)細節(jié)
    2023-05-05
  • Python讀取一個目錄下所有目錄和文件的方法

    Python讀取一個目錄下所有目錄和文件的方法

    這篇文章主要介紹了Python讀取一個目錄下所有目錄和文件的方法,涉及Python針對目錄和文件的遍歷與運算操作相關(guān)技巧,需要的朋友可以參考下
    2016-07-07

最新評論