python小白学习笔记《12.编码和文件读写》
0.编码
编码的本质就是让只认识0和1的计算机,能够理解我们人类使用的语言符号,并且将数据转换为二进制进行存储和传输。
这种从人类语言到计算机语言转换的形式,就叫做编码表,它让人类语言和计算机语言能够一一对应起来。
要了解编码,我们还得先来聊聊二进制。由于有二进制,0和1这两个数字才能像“太极生两仪,两仪生四象,四象生八卦”一样,涵盖容纳世间所有的信息。
0.0二进制
将十进制转换为二进制,以50为例子:
将二进制转换为十进制,以为1001例子:
两个二进制位 与十进制的对应关系:
二进制 | 十进制 |
---|---|
00 | 0 |
01 | 1 |
10 | 2 |
11 | 3 |
所以两个二进制位可以表示十进制的0,1,2,3四种状态。
继续往下推,当有三个二进制位的时候,可以表示0~7八种状态(也就是2的3次方)。
以此类推,当有八个二进制位的时候,就能表示2的8次方,也就是256种状态,它由8个0或1组成。
用来存放一位0或1,就是计算机里最小的存储单位,叫做【位】,也叫【比特】(bit)。我们规定8个比特构成一个【字节】(byte),这是计算机里最常用的单位。
1 byte = 8 bit,也就是1字节等于8比特
1B(byte) = 8bit
1KB(Kilobyte 千字节) = 1024B
1MB(Megabyte 兆字节) = 1024KB
1GB(Gigabyte 吉字节) = 1024MB
而百兆宽带,下载速度最多能达到十多兆,是因为运营商的带宽是以比特每秒为单位的,比如100M就是100Mbit/s。
0.1编码表
计算机一开始发明的时候,只是用来解决数字计算的问题。后来人们发现,计算机还可以做更多的事,正所谓能力越大,责任越大。但由于计算机只识“数”,因此人们必须告诉计算机哪个数字来代表哪个特定字符。
于是除了0、1这些阿拉伯数字,像a、b、c这样的52个字母(包括大小写),还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,理论上每个人都可以有自己的一套规则(这就叫编码)。
但大家如果想要互相沟通而不造成混乱,就必须使用相同的编码规则。如果使用了不同的编码规则,那就会彼此读不懂,这就是“乱码”的由来。
Unicode是内存编码的规范,而UTF-8是如何保存和传输Unicode的手段。
将编码史浓缩成一个表格表示,就是:
编码表 | 适用性 | 特点 |
---|---|---|
ASCII码 | 英文大小写,字符,不支持中文 | 美国发明,占用空间小 |
GB2312码,GBK码 | 支持中文 | GBK码是GB2312码的升级 |
Unicode | 支持国际语言 | 占用空间大,适用性强 |
UTF-8码 | 支持国际语言 | 是Unicode的升级,两者可以非常容易地相互转化,占用空间小。ASCII码被UTF-8码包含 |
人类语言千变万化,我们有《新华字典》《牛津英语字典》这样的辞书来记录和收纳。可以说,这些编码表就是计算机世界的字典辞书,它们同样也是人类智慧的结晶。
0.2encode()和decode()
编码,即将人类语言转换为计算机语言,就是【编码】encode();反之,就是【解码】decode()。它们的用法:
'你想编码的内容'.encode('你想使用的编码表')
'你想解码的内容'.decode('你想使用的编码表')
print('小明'.encode('utf-8'))
print('小明'.encode('gbk'))
print(b'\xe5\xb0\x8f\xe6\x98\x8e'.decode('utf-8'))
print(b'\xd0\xa1\xc3\xf7'.decode('gbk'))
终端:
所谓的编码,其实本质就是把str(字符串)类型的数据,利用不同的编码表,转换成bytes(字节)类型的数据。
编码结果中除了标志性的字母b,你还会在编码结果中看到许多\x,你再观察一下这个例子:b’\xce\xe2\xb7\xe3’。
\x是分隔符,用来分隔一个字节和另一个字节。
分隔符还挺常见的,我们在上网的时候经常会看到网址里面有好多的%,它们也是分隔符,替换了Python中的\x。比如像下面这个:
https://www.baidu.com/s?wd=%E5%B0%8F%E6%98%8E
\xe5\xb0\x8f\xe6\x98\x8e # Python编码“小明”的结果
%E5%B0%8F%E6%98%8E #网址里的‘小明’
它的意思就是在百度里面,搜索“小明”,使用的是UTF-8编码。其实它们除了分隔符以外,是一模一样的。
1.文件读写
文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本记录、音频片段、Excel文档、保存邮件以及任何保存在电脑上的东西。
假如你有一项工作,需要把100个Word文档里的资料合并到1个文件上,这时就能用上Python了。
或者,当你要从网上下载几千条数据时,直接用Python帮你把数据一次性存入文件也很方便。
1.0读取文件
首先,我们先在桌面新建一个test文件夹,然后在文件夹里新建一个名为abc的txt文件,在里面随便写点儿什么:
用编辑器Visual Studio Code打开这个文件,是这样的:
然后,用VS Code新建一个open.py的Python文件,也放在test文件夹里,我们就在这里写代码。
读文件的三步:开——读——关:
【第1步-开】使用open()函数打开文件。语法是这样的:
file1 = open('\Users\maria\Desktop\test\a.txt','r',encoding='utf-8')
\Users\maria\Desktop\test\a.txt是该文件在我电脑中的地址,要找到你的文件地址,只需要把你要打开的文件直接拖到编辑器终端的窗口里,就会显示出文件地址,然后复制一下就好。
字符串 ‘r’,表示 read,表示我们以读的模式打开了这个文件。
除了’r’,其他还有’w’(写入),‘a’(追加)等模式
encoding=‘utf-8’,表示的是返回的数据采用何种编码,一般采用utf-8或者gbk。
【第2步-读】
打开文件file1之后,就可以用read()函数进行读取的操作了:
file1 = open('\Users\maria\Desktop\test\a.txt','r',encoding='utf-8')
filecontent = file1.read()
第2行代码是读取file1的内容,写法是变量file1后面加个.句点,再加个read(),并且把读到的内容放在变量filecontent里面,这样我们才能拿到文件的内容。
现在我们想要看看读到了什么数据,可以用print()函数看看:
file1 = open(' \Users\maria\Desktop\test\a.txt','r',encoding='utf-8')
filecontent = file1.read()
print(filecontent)
【第3步-关】关闭文件,使用的是close()函数。
file1 = open(' \Users\maria\Desktop\test\a.txt','r',encoding='utf-8')
filecontent = file1.read()
print(filecontent)
file1.close()
为啥要关闭文件呢?原因有两个:
1.计算机能够打开的文件数量是有限制的,open()过多而不close()的话,就不能再打开文件了。
2.能保证写入的内容已经在文件里被保存好了。
文件关闭之后就不能再对这个文件进行读写了。如果还需要读写这个文件的话,就要再次 open() 打开这个文件。
学完了【读文件】,然后是【写文件】。
1.1写入文件
写文件也是三步:打开文件——写入文件——关闭文件。
【第1步-开】以写入的模式打开文件。
file1 = open('/Users/maria/Desktop/test/a.txt','w',encoding='utf-8')
以写入的模式打开了文件"abc.txt"。
open() 中还是三个参数,其他都一样,除了要把第二个参数改成’w’,表示write,即以写入的模式打开文件。
【第2步-写】往文件中写入内容,使用write()函数。
file1 = open('/Users/maria/Desktop/test/a.txt','w',encoding='utf-8')
file1.write('LISA\n')
file1.write('ROSE\n')
第2、3行代码:往a.txt文件里写入LISA和ROSE,\n表示另起一行。
运行代码后,打开文件a.txt:
用编辑器打开:
在桌面打开:
发现原先写的maria不见了,这是因为’w’写入模式会清空掉文件内容,然后再写入。
如果你只想增加东西,而不想完全覆盖掉原文件的话,就要使用’a’模式,表示append,是追加的意思。
使用’a’模式重写代码:
file1 = open('/Users/maria/Desktop/test/a.txt','a',encoding='utf-8')
file1.write('LISA\n')
file1.write('ROSE\n')
这样的话,就会追加成功,而不会覆盖了:
【第3步-关】还是要记得关闭文件,使用close()函数,看代码:
file1 = open('/Users/maria/Desktop/test/a.txt','a',encoding='utf-8')
file1.write('LISA\n')
file1.write('ROSE\n')
file1.close()
两个小提示:
1.write()函数写入文本文件的也是字符串类型。
2.在’w’和’a’模式下,如果你打开的文件不存在,那么open()函数会自动帮你创建一个