貓哥教你寫爬蟲 024--編碼&&解碼

什麼是亂碼?

亂碼意味着... 碼是亂的...

亂碼的緣由: 編碼和解碼使用的不是同一個字符集

1558940190712

編碼

字符串轉二進制就叫編碼...

二進制(逢二進一)

周幽王烽火戲諸侯。用烽火這種古老的信息傳遞形式

有火表明有敵人, 沒火表明沒有敵人...

只能表示兩種狀態, 那麼如何表示敵人的多少呢?

1558940380815

有個段子:世界上有10種人,懂二進制和不懂二進制的

若是是三個呢...

1558940458121

用來存放一位0或1,就是計算機裏最小的存儲單位,叫作【位】,也叫【比特】(bit)。

咱們規定8個比特構成一個【字節】(byte),這是計算機裏最經常使用的單位。

1558940492233

bitbyte長得有點像,可別混淆!1 byte = 8 bit,也就是1字節等於8比特。

1558940517765

百兆寬帶是什麼意思?

下載速度最多能達到十多兆,是由於運營商的帶寬是以比特每秒爲單位的,好比100M就是100Mbit/s

咱們常看到的下載速度KB倒是以字節每秒爲單位顯示的,1byte = 8bit,

因此運營商說的帶寬得先除以8,你的百兆寬帶下載速度,也就是十幾兆了。

編碼表

用數字表明字符

1558941251108

ASCII 用七位二進制來表示字符, 總共是128 可能性...

美國人民很開心, 中國人民表示不夠用...(中國漢字10萬多...)

自力更生, 擴展

GB2312,它用2個字節,也就是16個比特位,來表示絕大部分(65535個)經常使用漢字

GBK支持更多字符(共收錄漢字21003個、符號883個,並提供1894個造字碼位,簡、繁合併)

同理, 小日本兒也有一套本身的標準, 韓國棒子也有一套本身的標準

印度阿三... 沒有, 印度的國語是英語...

爲了溝通的便利,Unicode(萬國碼)應運而生,這套編碼表將世界上全部的符號都歸入其中。

每一個符號都有一個獨一無二的編碼,如今Unicode能夠容納100多萬個符號,全部語言均可以互通

問題: 爲遷就一些佔用字節比較多的語言,英文也要跟着佔兩個字節...

天才的想法:UTF-8(8-bit Unicode Transformation Format)

Unicode的可變長度字符編碼,使用1~4個字節表示一個符號,不一樣的符號, 變化字節長度

而當字符在ASCII碼的範圍時,就用一個字節表示,因此UTF-8還能夠兼容ASCII編碼

Unicode是內存編碼的規範,而UTF-8是如何保存和傳輸Unicode的手段。

1558942064622
1558942094678

二進制和八進制,十六進制的關係

8進制是用0,1,2,3,4,5,6,7

16進制是用0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f來表示。

好比說,字母K在ASCII編碼表用不一樣進製表示的話是這樣的:

1558942168832

由於2的3次方是8, 2的4次方是16,

因此3位二進制能夠轉換成1位8進制, 4位二進制能夠轉換成1位16進制

1558940863907

天才槍手觀後感...

1558941959695

跨時區做弊...

1558941789833
1558941806840

編碼和解碼

Python3當中,程序處理咱們輸入的字符串, 默認使用Unicode編碼的,因此什麼語言均可以輸入。

一些中文的文件和中文網站,還在使用GBK,和GB2312

有時候面對不一樣編碼的數據,咱們要進行一些操做來實現轉換

由於若是編碼和解碼用的規則不一樣, 就會亂碼...

1558942551731
1558942598340

encode()和decode()

將人類語言(字符)轉換爲計算機語言(二進制),就是【編碼】encode()

反之,就是【解碼】decode()

1558942700160

print('許竣皓'.encode('utf-8'))
print('許竣皓'.encode('gbk'))
print(b'\xe8\xae\xb8\xe7\xab\xa3\xe7\x9a\x93'.decode('utf-8'))
print(b'\xd0\xed\xbf\xa2\xf0\xa9'.decode('gbk'))
複製代碼

b'\xce\xe2\xb7\xe3',這表明它是bytes(字節)類型的數據

1558948471841

編碼,本質就是把str(字符串)類型的數據,

利用不一樣的編碼表,轉換成bytes(字節)類型的數據。

1558948648136
1558948611243

decode()用於解碼

1558948747717

print(b'\xe8\xae\xb8\xe7\xab\xa3\xe7\x9a\x93'.decode('utf8')) # 許竣皓
複製代碼

文件讀寫

讀寫文件? 雙擊打開不就能改了?

若是要把100個文件的內容合成一個呢?好比名偵探柯南小說合集...

python讀取文件

1558948954323

先建立一個work.txt, 再使用python讀取裏面的內容

1558964499329
1558964514845
1558964613889
1558964715320
1559008582420

file = open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','r',encoding='utf-8')
filecontent = file.read() # 讀取全部內容
file.close()
print(filecontent)
複製代碼

1558964806317
1559008662764

爲何要關閉?

1.計算機可以打開的文件數量是有限制的,open()過多而不close()的話,佔用計算機資源。

2.能保證寫入的內容已經在文件裏被保存好了。

python寫文件

1558964914200

在work.txt裏再寫一行, "確認過眼神, 是社會主義加班人!"

1559008963686

file = open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','w',encoding='utf-8')
filecontent = file.write('確認過眼神, 是社會主義加班人!')
file.close()
複製代碼

1558965120772

file = open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','w',encoding='utf-8')
filecontent = file.write('確認過眼神, 是社會主義加班人!')
file.close()
file = open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','r',encoding='utf-8')
print(file.read())
file.close()
複製代碼

w表明寫入, 會覆蓋以前的內容, 若是追加, 請使用a

1558965264487

file = open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','a',encoding='utf-8')
filecontent = file.write('確認過眼神, 是社會主義加班人!')
file.close()
file = open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','r',encoding='utf-8')
print(file.read())
file.close()
複製代碼

在**'w''a'模式下,若是你打開的文件不存在,那麼open()**函數會自動幫你建立一個

1558965364664
1558965386320

若是不想每次都close(), 可使用with open... as

原來的代碼...

file = open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','a',encoding='utf-8')
filecontent = file.write('確認過眼神, 是社會主義加班人!')
file.close()
file = open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','r',encoding='utf-8')
print(file.read())
file.close()
複製代碼

使用open with open... as 的代碼...

with open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','a',encoding='utf-8') as file:
    filecontent = file.write('確認過眼神, 是社會主義加班人!')
with open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','r',encoding='utf-8') as file:
    print(file.read())
複製代碼

小做業: 計算總分和平均分

假設有一個文件scores.txt

張三 23 35 44 66 88
李四 60 77 68 88 90
王五 97 99 89 91 95 90
趙六 100 85 90 77 99 66
複製代碼

結果相似於...

張三 23 35 44 66 88 總分 256 平均分 51.2
複製代碼

須要的新知識

讀取每一行 readlines()

1558967610399

str 轉 list ==> str.split()

1558967762604

list 轉 str ==> 分隔符.join(list)

1558967869559

遍歷數組, 寫入文件writelines()

1558968144004

快速跳轉:

貓哥教你寫爬蟲 000--開篇.md
貓哥教你寫爬蟲 001--print()函數和變量.md
貓哥教你寫爬蟲 002--做業-打印皮卡丘.md
貓哥教你寫爬蟲 003--數據類型轉換.md
貓哥教你寫爬蟲 004--數據類型轉換-小練習.md
貓哥教你寫爬蟲 005--數據類型轉換-小做業.md
貓哥教你寫爬蟲 006--條件判斷和條件嵌套.md
貓哥教你寫爬蟲 007--條件判斷和條件嵌套-小做業.md
貓哥教你寫爬蟲 008--input()函數.md
貓哥教你寫爬蟲 009--input()函數-人工智能小愛同窗.md
貓哥教你寫爬蟲 010--列表,字典,循環.md
貓哥教你寫爬蟲 011--列表,字典,循環-小做業.md
貓哥教你寫爬蟲 012--布爾值和四種語句.md
貓哥教你寫爬蟲 013--布爾值和四種語句-小做業.md
貓哥教你寫爬蟲 014--pk小遊戲.md
貓哥教你寫爬蟲 015--pk小遊戲(全新改版).md
貓哥教你寫爬蟲 016--函數.md
貓哥教你寫爬蟲 017--函數-小做業.md
貓哥教你寫爬蟲 018--debug.md
貓哥教你寫爬蟲 019--debug-做業.md
貓哥教你寫爬蟲 020--類與對象(上).md
貓哥教你寫爬蟲 021--類與對象(上)-做業.md
貓哥教你寫爬蟲 022--類與對象(下).md
貓哥教你寫爬蟲 023--類與對象(下)-做業.md
貓哥教你寫爬蟲 024--編碼&&解碼.md
貓哥教你寫爬蟲 025--編碼&&解碼-小做業.md
貓哥教你寫爬蟲 026--模塊.md
貓哥教你寫爬蟲 027--模塊介紹.md
貓哥教你寫爬蟲 028--模塊介紹-小做業-廣告牌.md
貓哥教你寫爬蟲 029--爬蟲初探-requests.md
貓哥教你寫爬蟲 030--爬蟲初探-requests-做業.md
貓哥教你寫爬蟲 031--爬蟲基礎-html.md
貓哥教你寫爬蟲 032--爬蟲初體驗-BeautifulSoup.md
貓哥教你寫爬蟲 033--爬蟲初體驗-BeautifulSoup-做業.md
貓哥教你寫爬蟲 034--爬蟲-BeautifulSoup實踐.md
貓哥教你寫爬蟲 035--爬蟲-BeautifulSoup實踐-做業-電影top250.md
貓哥教你寫爬蟲 036--爬蟲-BeautifulSoup實踐-做業-電影top250-做業解析.md
貓哥教你寫爬蟲 037--爬蟲-寶寶要聽歌.md
貓哥教你寫爬蟲 038--帶參數請求.md
貓哥教你寫爬蟲 039--存儲數據.md
貓哥教你寫爬蟲 040--存儲數據-做業.md
貓哥教你寫爬蟲 041--模擬登陸-cookie.md
貓哥教你寫爬蟲 042--session的用法.md
貓哥教你寫爬蟲 043--模擬瀏覽器.md
貓哥教你寫爬蟲 044--模擬瀏覽器-做業.md
貓哥教你寫爬蟲 045--協程.md
貓哥教你寫爬蟲 046--協程-實踐-吃什麼不會胖.md
貓哥教你寫爬蟲 047--scrapy框架.md
貓哥教你寫爬蟲 048--爬蟲和反爬蟲.md
貓哥教你寫爬蟲 049--完結撒花.mdhtml

相關文章
相關標籤/搜索