猫哥教你写爬虫 024--编码&&解码

什么是乱码?

乱码意味着... 码是乱的...

乱码的原因: 编码和解码使用的不是同一个字符集

编码

字符串转二进制就叫编码...

二进制(逢二进一)

周幽王烽火戏诸侯。用烽火这种古老的信息传递形式

有火代表有敌人, 没火代表没有敌人...

只能表示两种状态, 那么如何表示敌人的多少呢?

有个段子:世界上有10种人,懂二进制和不懂二进制的

如果是三个呢...

用来存放一位0或1,就是计算机里最小的存储单位,叫做【位】,也叫【比特】(bit)。

我们规定8个比特构成一个【字节】(byte),这是计算机里最常用的单位。

bitbyte长得有点像,可别混淆!1 byte = 8 bit,也就是1字节等于8比特。

百兆宽带是什么意思?

下载速度最多能达到十多兆,是因为运营商的带宽是以比特每秒为单位的,比如100M就是100Mbit/s

我们常看到的下载速度KB却是以字节每秒为单位显示的,1byte = 8bit,

所以运营商说的带宽得先除以8,你的百兆宽带下载速度,也就是十几兆了。

编码表

用数字代表字符

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的手段。

二进制和八进制,十六进制的关系

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编码表用不同进制表示的话是这样的:

因为2的3次方是8, 2的4次方是16,

所以3位二进制可以转换成1位8进制, 4位二进制可以转换成1位16进制

天才枪手观后感...

跨时区作弊...

编码和解码

Python3当中,程序处理我们输入的字符串, 默认使用Unicode编码的,所以什么语言都可以输入。

一些中文的文件和中文网站,还在使用GBK,和GB2312

有时候面对不同编码的数据,我们要进行一些操作来实现转换

因为如果编码和解码用的规则不同, 就会乱码...

encode()和decode()

将人类语言(字符)转换为计算机语言(二进制),就是【编码】encode()

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

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(字节)类型的数据

编码,本质就是把str(字符串)类型的数据,

利用不同的编码表,转换成bytes(字节)类型的数据。

decode()用于解码

print(b'\xe8\xae\xb8\xe7\xab\xa3\xe7\x9a\x93'.decode('utf8')) # 许竣皓
复制代码

文件读写

读写文件? 双击打开不就能改了?

如果要把100个文件的内容合成一个呢?比如名侦探柯南小说合集...

python读取文件

先创建一个work.txt, 再使用python读取里面的内容

file = open('C:\\Users\\Administrator\\Desktop\\demo\\work.txt','r',encoding='utf-8')
filecontent = file.read() # 读取所有内容
file.close()
print(filecontent)
复制代码

为什么要关闭?

1.计算机能够打开的文件数量是有限制的,open()过多而不close()的话,占用计算机资源。

2.能保证写入的内容已经在文件里被保存好了。

python写文件

在work.txt里再写一行, "确认过眼神, 是社会主义加班人!"

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','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

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()**函数会自动帮你创建一个

如果不想每次都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()

str 转 list ==> str.split()

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

遍历数组, 写入文件writelines()

快速跳转:

猫哥教你写爬虫 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--完结撒花.md

转载于:https://juejin.im/post/5cfc4ad9e51d455d850d3ac0

你可能感兴趣的:(猫哥教你写爬虫 024--编码&&解码)