一:编码

编码的本质就是让只认识0和1的计算机,能够理解我们人类使用的语言符号,并且将数据转换为二进制进行存储和传输。

1.二进制

比如用篝火来表示人数

Python Linux 绝对路径使用 python open 绝对路径_数据

用来存放一位0或1,就是计算机里最小的存储单位,叫做【位】,也叫【比特】(bit)。我们规定8个比特构成一个【字节】(byte),这是计算机里最常用的单位。

Python Linux 绝对路径使用 python open 绝对路径_数据_02

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

2.编码表

除了0、1这些阿拉伯数字,像a、b、c这样的52个字母(包括大小写),还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,理论上每个人都可以有自己的一套规则(这就叫编码)。

但大家如果想要互相沟通而不造成混乱,就必须使用相同的编码规则。如果使用了不同的编码规则,那就会彼此读不懂,这就是“乱码”的由来。为了避免乱码,一段世界历史就此启动。一开始,是美国首先出台了ASCII编码,统一规定了常用符号用哪些二进制数来表示。

UTF-8(8-bit Unicode Transformation Format)。

它是一种针对Unicode的可变长度字符编码,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,而当字符在ASCII码的范围时,就用一个字节表示,所以UTF-8还可以兼容ASCII编码。

编码史浓缩成一个表格表示,就是下表:

Python Linux 绝对路径使用 python open 绝对路径_字符串_03

3.八进制和十六进制

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

Python Linux 绝对路径使用 python open 绝对路径_Python Linux 绝对路径使用_04

接下来,介绍几种编码方案在当前的使用情况:

第0,计算机是有自己的工作区的,这个工作区被称为“内存”。数据在内存当中处理时,使用的格式是Unicode,统一标准。

Python Linux 绝对路径使用 python open 绝对路径_字符串_05

第1,数据在硬盘上存储,或者是在网络上传输时,用的是UTF-8,因为节省空间。但你不必操心如何转换UTF-8和Unicode,当我们点击保存的时候,程序已经“默默地”帮我们做好了编码工作。

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

基于此,有时候面对不同编码的数据,我们要进行一些操作来实现转换。这里就涉及接下来要讲的【encode】(编码)和【decode】(解码)的用法。

4.encode()和decode()

编码,即将人类语言转换为计算机语言,就是【编码】encode();反之,就是【解码】decode()。它们的用法如下图所表示:

Python Linux 绝对路径使用 python open 绝对路径_Python Linux 绝对路径使用_06

1~2行是encode()的用法,3-4行是decode()的用法

Python Linux 绝对路径使用 python open 绝对路径_txt文件_07

将人类语言编码后得到的结果,有一个相同之处,就是最前面都有一个字母b,比如b'\xce\xe2\xb7\xe3',这代表它是bytes(字节)类型的数据,我们可以用type()函数验证一下。

Python Linux 绝对路径使用 python open 绝对路径_txt文件_08

所谓的编码,其实本质就是把str(字符串)类型的数据,利用不同的编码表,转换成bytes(字节)类型的数据

编码结果中除了标志性的字母b,你还会在编码结果中看到许多\x,你再观察一下这个例子:b'\xce\xe2\xb7\xe3'。\x是分隔符,用来分隔一个字节和另一个字节。

此外,用decode()解码的时候则要注意,UTF-8编码的字节就一定要用UTF-8的规则解码,其他编码同理,否则就会出现乱码或者报错的情况

Python Linux 绝对路径使用 python open 绝对路径_txt文件_09

我们再来看下ASCII编码,它不支持中文,所以我们来转换一个大写英文字母K。

Python Linux 绝对路径使用 python open 绝对路径_数据_10

看到大写字母K被编码后还是K,但这两个K对计算机来说意义是不同的。前者是字符串,采用系统默认的Unicode编码,占两个字节。后者则是bytes类型的数据,只占一个字节。这也验证我们前面所说的编码就是将str类型转换成bytes类型。

二:文件读写

文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本记录、音频片段、Excel文档、保存邮件以及任何保存在电脑上的东西。

1.读取文件

Python Linux 绝对路径使用 python open 绝对路径_Python Linux 绝对路径使用_11

电脑需要安装Python环境,如果没有安装的可以看下我之前发的Python安装教程。

首先,我们先在桌面新建一个test文件夹,然后在文件夹里新建一个名为abc的txt文件,在里面随便写点儿什么,然后用编辑器Visual Studio Code打开这个文件。

Python Linux 绝对路径使用 python open 绝对路径_字符串_12

然后用VS Code新建一个open.py的Python文件,也放在test文件夹里,我们就在这里写代码。

【第1步-开】使用open()函数打开文件。语法是这样的:

Python Linux 绝对路径使用 python open 绝对路径_数据_13

file1这个变量是存放读取的文件数据的,以便对文件进行下一步的操作。

open()函数里面有三个参数

Python Linux 绝对路径使用 python open 绝对路径_Python Linux 绝对路径使用_14

第一个参数是文件的保存地址,一定要写清楚,否则计算机找不到。

要找到你的文件地址,只需要把要打开的文件直接拖到编辑器终端的窗口里,就会显示出文件地址,然后复制一下就好。

不过文件的地址有两种:相对路径和绝对路径,拖到终端获取的地址是绝对路径。

绝对路径就是最完整的路径,相对路径指的就是【相对于当前文件夹】的路径,也就是编写的这个py文件所放的文件夹路径。

如果你要打开的文件和open.py在同一个文件夹里,这时只要使用相对路径就行了,而要使用其他文件夹的文件则需使用绝对路径。

将txt文件拖入终端窗口,获得文件的绝对路径

Python Linux 绝对路径使用 python open 绝对路径_数据_15

Windows系统里,常用\来表示绝对路径,/来表示相对路径,所以当你把文件拖入终端的时候,绝对路径就变成:

Python Linux 绝对路径使用 python open 绝对路径_数据_16

\在Python中是转义字符,所以时常会有冲突。为了避坑,Windows的绝对路径通常要稍作处理,写成以下两种格式;

Python Linux 绝对路径使用 python open 绝对路径_字符串_17

获取文件的相对路径还有个小窍门,用VS Code打开文件夹,在文件点击右键,选择:

Python Linux 绝对路径使用 python open 绝对路径_字符串_18

第二个参数表示打开文件时的模式。这里是字符串 'r',表示 read,表示我们以读的模式打开了这个文件。除了'r',其他还有'w'(写入),'a'(追加)等模式。

第三个参数encoding='utf-8',表示的是返回的数据采用何种编码,一般采用utf-8或者gbk。注意这里是写encoding而不是encode。

读文件的三步:开——读——关,【第1步-开】我们就讲完了,现在看【第2步-读】。

Python Linux 绝对路径使用 python open 绝对路径_open绝对路径 python_19

第2行代码就是在读取file1的内容,写法是变量file1后面加个.句点,再加个read(),并且把读到的内容放在变量filecontent里面,这样我们才能拿到文件的内容。

现在我们想要看看读到了什么数据,可以用print()函数看看。请你在自己的电脑里,把剩下的代码补全,可参考下面的代码

Python Linux 绝对路径使用 python open 绝对路径_Python Linux 绝对路径使用_20

然后,在编辑器窗口【右键】,选择【在终端中运行Python文件】,这时终端显示的是:

Python Linux 绝对路径使用 python open 绝对路径_txt文件_21

【第3步-关】关闭文件,使用的是close()函数。

Python Linux 绝对路径使用 python open 绝对路径_Python Linux 绝对路径使用_22

关闭文件的原因有两个:1.计算机能够打开的文件数量是有限制的,open()过多而不close()的话,就不能再打开文件了。2.能保证写入的内容已经在文件里被保存好了。

总结图:

Python Linux 绝对路径使用 python open 绝对路径_字符串_23

2.写文件

Python Linux 绝对路径使用 python open 绝对路径_open绝对路径 python_24

【第1步-开】以写入的模式打开文件。

第1行代码:以写入的模式打开了文件"abc.txt"。

open()中还是三个参数,其他都一样,除了要把第二个参数改成'w',表示write,即以写入的模式打开文件。

【第2步-写】往文件中写入内容,使用write()函数。

Python Linux 绝对路径使用 python open 绝对路径_字符串_25

第2-3行代码:往“abc.txt”文件中写入了“张无忌”和“宋青书”这两个字符串。\n表示另起一行。

''w'写入模式会给你暴力清空掉文件,然后再给你写入。

Python Linux 绝对路径使用 python open 绝对路径_字符串_26

如果你只想增加东西,而不想完全覆盖掉原文件的话,就要使用'a'模式,表示append,你学过,它是追加的意思。

如果不想把之前txt文件中的内容弄没的话,可以这么写:

Python Linux 绝对路径使用 python open 绝对路径_txt文件_27

【第3步-关】还是要记得关闭文件,使用close()函数,看代码:

Python Linux 绝对路径使用 python open 绝对路径_字符串_28

有两个小提示:1.write()函数写入文本文件的也是字符串类型。2.在'w'和'a'模式下,如果你打开的文件不存在,那么open()函数会自动帮你创建一个。

在一个叫1.txt文件里写入字符串'难念的经' 然后读取这个1.txt文件的内容,并打印出来。

Python Linux 绝对路径使用 python open 绝对路径_Python Linux 绝对路径使用_29

总结下写文件的三步法:

Python Linux 绝对路径使用 python open 绝对路径_open绝对路径 python_30

如果我们想写入的数据不是文本内容,而是音频和图片的话,该怎么做呢?

Python Linux 绝对路径使用 python open 绝对路径_字符串_31

这里再顺便补充一个用法,为了避免打开文件后忘记关闭,占用资源或当不能确定关闭文件的恰当时机的时候,我们可以用到关键字with,之前的例子可以写成这样:

Python Linux 绝对路径使用 python open 绝对路径_open绝对路径 python_32

3.小练习

在自己的电脑里新建一个scores.txt来操作

Python Linux 绝对路径使用 python open 绝对路径_数据_33

统计这四个学生的魔法作业的总得分,然后再写入一个txt文件。我们是需要把四个人的数据分开处理的,我们想要按行处理,而不是一整个处理,所以读的时候也希望逐行读取。我们需要使用一个新函数readlines(),也就是“按行读取”。

Python Linux 绝对路径使用 python open 绝对路径_数据_34

readlines() 会从txt文件取得一个列表,列表中的每个字符串就是scores.txt中的每一行。而且每个字符串后面还有换行的\n符号。

我们就可以使用for循环来遍历这个列表,然后处理列表中的数据

Python Linux 绝对路径使用 python open 绝对路径_txt文件_35

我们要把这里每一行的名字、分数也分开,这时需要我们使用split()来把字符串分开,它会按空格把字符串里面的内容分开。

Python Linux 绝对路径使用 python open 绝对路径_字符串_36

split()是把字符串分割的,而还有一个join()函数,是把字符串合并的。

Python Linux 绝对路径使用 python open 绝对路径_数据_37

这4个列表的第0个数据是姓名,之后的就是成绩。我们需要先统计各人的总成绩,然后把姓名和成绩放在一起。

Python Linux 绝对路径使用 python open 绝对路径_字符串_38

接下来就是把成绩写入一个空的列表,因为这样才有助于我们之后写入一个txt文件。

Python Linux 绝对路径使用 python open 绝对路径_txt文件_39

14行的代码是打开一个叫winner.txt的文件。(如果电脑中不存在winner.txt的话,这行代码会帮你自动新建一个空白的winner.txt)

15行的代码是以writelines()的方式写进去,为什么不能用write()?因为final_scores是一个列表,而write()的参数必须是一个字符串,而writelines()可以是序列,所以我们使用writelines()。

本节课程就到这里,内容有点多,希望大家反复观看