演示文件為docx文檔,內(nèi)容如下:
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),巴州企業(yè)網(wǎng)站建設(shè),巴州品牌網(wǎng)站建設(shè),網(wǎng)站定制,巴州網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,巴州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
源碼
運行源碼查看報錯信息
UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 15: illegal multibyte sequence
上述錯誤是一種很常見的解碼錯誤,下面介紹該錯誤的解決方法
把utf-8,gbk等各種編碼方式都試了一遍,還是沒有解決問題然后仔細(xì)看報錯信息,根據(jù)UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfb in position 14: invalid start byte,猜測文件中某個字節(jié)不能解碼,打開文件一看,并沒有看出什么問題來
open() 函數(shù)的第三個參數(shù)不是用來接收編碼方式的,而是傳入一個buffering的值,此處傳入了'gbk'字符串,所以系統(tǒng)提示傳一個整型
通過調(diào)用office的API進(jìn)行操作,因為在office上能完成的操作,都能通過win32完成,所以我們選擇使用win32
(Python3.5 需要安裝 win32compat,里面含了 win32 的很多包)
base64 是經(jīng)常使用的一種加密方式,在 Python 中有專門的庫支持。
本文主要介紹在 Python2 和 Python3 中的使用區(qū)別:
在 Python2 環(huán)境:
在 Python3 環(huán)境:
Python3 中有一些區(qū)別,因為 Python3 中字符都是 unicode 編碼,而 b64encode 函數(shù)的參數(shù)為 byte 類型,所以必須先轉(zhuǎn)碼。
以上就是本文的全部內(nèi)容,如果覺得有用的話歡迎 點贊 和 轉(zhuǎn)發(fā) ,多謝。
推薦閱讀:
下面一張圖搞懂編碼、解碼、編碼表之間的關(guān)系。
不難看出,它們是一種根據(jù)編碼表進(jìn)行翻譯、映射的過程:
實際上,字符串類型只有encode()方法,沒有decode()方法,而bytes類型只有decode()方法而沒有encode()方法。
二進(jìn)制格式的數(shù)據(jù)也常稱為裸數(shù)據(jù)(raw data),所以str數(shù)據(jù)經(jīng)過編碼后得到raw data,raw data解碼后得到的str。
上面說了,編碼是將字符數(shù)據(jù)轉(zhuǎn)換成字節(jié)數(shù)據(jù)(raw data),解碼是將字節(jié)數(shù)據(jù)轉(zhuǎn)換成字符數(shù)據(jù)。在Python中字符數(shù)據(jù)也就是字符串,即str類型,字節(jié)數(shù)據(jù)也就是bytes類型或bytearray類型。
編碼時,可以使用字節(jié)類型的構(gòu)造方法bytes()、bytearray()來構(gòu)造字節(jié),也可以使用str類型的encode()方法來轉(zhuǎn)換。
解碼時,可以使用str類型的構(gòu)造方法str()來構(gòu)造字符串,也可以使用bytes、bytearray()類型的decode()方法。
另外需要注意的是,編碼和解碼的過程中都需要指定編碼表(字符集),默認(rèn)采用的是utf-8字符集。
例如,使用encode()的方式將str編碼為bytes數(shù)據(jù)。
使用bytes()和bytearray()將str構(gòu)造成bytes或bytearray數(shù)據(jù),這兩個方法都要求str-byte的過程中給定編碼。
實際上,bytes()、bytearray()這兩個方法構(gòu)造字節(jié)數(shù)據(jù)的時候還有點復(fù)雜,因為可以從多個數(shù)據(jù)源來構(gòu)造,比如字符串、整數(shù)值、buffer。如何使用這兩個方法構(gòu)造字節(jié)數(shù)據(jù),詳細(xì)內(nèi)容參考help(bytes)和help(bytearray)給出的說明,這里給幾個簡單示例。
構(gòu)造bytes的方式:
構(gòu)造bytearray的方式:
解碼是字節(jié)序列到str類型的轉(zhuǎn)換。
例如,使用decode()方法進(jìn)行解碼"我"字,它的utf-8的編碼對應(yīng)為"\xe6\x88\x91":
使用str()進(jìn)行轉(zhuǎn)換。
當(dāng)編碼、解碼的過程使用了不同的(不兼容的)編碼表時,就會出現(xiàn)亂碼。所以,解決亂碼的唯一方式是指定對應(yīng)的編碼表進(jìn)行編碼、解碼。
例如,使用utf-8編碼"我"字,得到一個bytes序列,然后使用gbk解碼這個bytes序列。
這里報錯了,因為utf-8的字節(jié)序列里有g(shù)bk無法解碼的字節(jié)。如果使用文本編輯器一樣的工具去顯化這個過程,得到的將是亂碼字符。
原文地址:
對于單個字符的編碼,Python提供了ord()函數(shù)獲取字符的整數(shù)表示,chr()函數(shù)把編碼轉(zhuǎn)換為對應(yīng)的字符:
最常用的編碼是UTF-8,如果沒有特殊業(yè)務(wù)要求,請牢記僅使用UTF-8編碼。
在爬蟲中會經(jīng)常遇見,需要用encode和decode來進(jìn)行互相轉(zhuǎn)碼
str轉(zhuǎn)bytes
注意,含有中文字符的str不能用acsii格式轉(zhuǎn)碼
bytes轉(zhuǎn)str
** 程序中經(jīng)常會遇到個別字符轉(zhuǎn)碼不成功而報錯,因此在decode方法中需要這個參數(shù)errors='ignore'忽略錯誤的字節(jié)
注意格式化的數(shù)據(jù)格式
一 前言 ?
最近一直在做開發(fā)相關(guān)的工作--基于Django的web 平臺,其中需要從model層傳輸數(shù)據(jù)到view 層做數(shù)據(jù)展示或者做業(yè)務(wù)邏輯處理。我們采用通用的Json格式--Json(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,易于閱讀和程序解析。
二 認(rèn)識Json
2.1 Json 結(jié)構(gòu)
常見的Json格式為 “名稱/值”對的集合,其中 值可以是對象,列表,字典,字符串等等。比如
backup_data?=?{"back_to_host":?"dbbk0",
"ip_address":?"10.10.20.3",
"host_name":?"rac4",
"port":?3306}
2.2 使用Json
Python的Json模塊序列化與反序列化的過程分別是 編碼和解碼。這兩個過程涉及到兩組不同的函數(shù)
編碼 把一個Python對象編碼轉(zhuǎn)換成Json字符串,json.dumps(data)/json.dump(data,file_handler)
解碼 把Json格式字符串解碼轉(zhuǎn)換成Python對象,json.loads(data)/json.load(file_handler)
在python中要使用Json模塊做相關(guān)操作,必須先導(dǎo)入:
import Json
2.3 主要函數(shù)
編碼函數(shù)主要有 json.dumps(data)/json.dump(data,file_handler)
json.dumps()的參數(shù)是將python對象轉(zhuǎn)換為字符串,如使用json.dumps序列化的對象json_dumps=json.dumps({'a':1, 'b':2}) ,json_dumps='{"b": 2, "a": 1}'
json.dump 是將內(nèi)置類型序列化為json對象后寫入文件。
解碼函數(shù)主要由json.loads(data)/json.load(file_handler) ?
json.loads的參數(shù)是內(nèi)存對象,把Json格式字符串解碼轉(zhuǎn)換成Python對象,json_loads=json.loads(d_json) ?#{ b": 2, "a": 1},使用load重新反序列化為dict
json.load()的參數(shù)針對文件句柄,比如本地有一個文件/tmp/test.json ?json_load=json.load(open('/tmp/test.json'))
具體案例參考如下:
In?[3]:?data={"back_to_host":?"rac1",
...:?"ip_address":?"10.215.20.3",
...:?"host_name":?"rac3",
...:?"port":?3306}
In?[7]:?json_str=json.dumps(data)
In?[8]:?print json_str
{"ip_address":?"10.215.20.3",?"back_to_host":?"rac1",?"host_name":?"rac3",?"port":?3306}
In?[9]:?json_loads=json.load(json_str)
---------------------------------------------------------------------------
AttributeError Traceback?(most recent?call?last)
ipython-input-9-180506f16431?in?module()
----?1 json_loads=json.load(json_str)
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc?in?load(fp,?encoding,?cls,?object_hook,?parse_float,?parse_int,?parse_constant,?object_pairs_hook,?**kw)
284
285?""
注意 從上面的報錯信息來看 json.loads 傳參是字符串類型,并不是文件句柄,沒有 read()屬性。
In?[10]:?json_loads=json.loads(json_str)
In?[11]:?print json_loads
{u'back_to_host':?u'rac1',?u'ip_address':?u'10.215.20.3',?u'host_name':?u'rac3',?u'port':?3306}
In?[12]:?type(json_loads)
Out[12]:?dict
In?[13]:?type(json_str)
Out[13]:?str
利用dump 將數(shù)據(jù)寫入 dump.json
In?[17]:?with open('/tmp/dump.json','w')?as f:
...:?json.dump(json_str,f)
...:
yangyiDBA:~?yangyi$ cat /tmp/dump.json
"{\"ip_address\": \"10.10.20.3\", \"back_to_host\": \"rac1\", \"host_name\": \"rac3\", \"port\": 3306}"
yangyiDBA:~?yangyi$
利用json.load 將dump.sjon的數(shù)據(jù)讀出來并賦值給 data?
In?[18]:?with open('/tmp/dump.json','r')?as f:
...:?data=json.load(f)
...:
In?[19]:?print data
{"ip_address":?"10.10.20.3",?"back_to_host":?"rac1",?"host_name":?"rac3",?"port":?3306}
三 小結(jié)
本文算是一篇學(xué)習(xí)筆記,主要對比了json.loads/json.load ?, json.dumps/ json.dump 的使用差異 ,方便以后更好的使用json 。
以上為本次分享內(nèi)容,感謝觀看。