一 编码与解码:

编码与解码的概念:
第10001次讲编码解码问题,编码解码讲的是二进制与字符之间的解析问题。文本从使用上来看有以下几种情景:存储、传输、展示。在文本存储、传输中都使用字节流的方式,也就是比特流(1byte=8bit嘛),这时候只是单纯01编码;而文本在显示时是以"文字"的方式展现。
存在一个问题:文字按什么规则转为二进制,二进制按什么规则转为文字?这就是编码与解码:文字str转为二进制bytes叫编码encode,二进制bytes转为文字str叫解码decode。

python中的编码与解码:
1.python默认的是utf-8编码方式,也就是说文字对照UTF-8编码表转为二进制比特流,存储在内存、硬盘,或通过网络传输。但是也可以自己指定编码方式进行存储,个人理解就是,先输入文字,此时python默认生成utf-8的二进制码存储在内存中,再指定unicode方式进行存储,此时python将utf-8的二进制码转为unicode下对应的二进制码。
2.python默认的是用utf-8解码方式,将从网络、内存、硬盘接收到的二进制比特流,对照UTF-8编码表转为文字str进行展示。但是也可以自己指定解码方式将二进制流转为文字。
3.从以上描述可知,若存储时人为指定编码方式,而读取时采用默认解码方式,会出现乱码现象:如指定以unicode方式对字符进行编码存储,存为硬盘中的文本(即以unicode对应得到比特流进行存储),打开时python默认utf-8对打开的二进制流进行解码,此时发生乱码了。
4.python中的自动编码解码是针对用户创建的str类型变量,对其存储和读取时的操作。如果用户创建的是bytes类型,python不会对其进行自动编码解码操作的,bytes本来就是二进制码,用户怎么创建python就怎么存储和读取。而用户将str变量转为bytes变量,必须指定编码格式。
5.python命令行中对比特流的展示并不是01串,而是以16进制的方式显示,如\xAC,其中\x为python中表示16进制的方式(和习惯中的0x方式不一样)

二 文件打开模式:

https://www.runoob.com/python3/python3-file-methods.html

1.个人理解:基本打卡模式有三种:r、w、a;附加打卡模式有两种:b、+;独立打卡模式有两种:t、x。基本模式能够与附加模式组合。
2.文本文件直接使用r、w、a打开,python默认按UTF-8编码解析;图像、视频、音频文件以二进制模式打开,需要r、w、a加上附加模式b。
3.r有关的模式,若文件不存在则报错;w、a有关的模式,若文件不存在则创建
4.文件读取时是读取文件指针到文件末尾的内容,若用a+模式打开,读取的内容会为空,需要将指针以到文件开头

打开模式

作用

r

只读,指针位于文件开头。默认模式

w

只写,删除原有内容,指针位于文件开头

a

只追加写,不删除原有内容,指针位于文件末尾

b

二进制模式

+

可读可写

t

文本模式

x

创建并写,若存在则报错

r+

读写,不删除原有内容,指针放于文件开头

w+

读写,删除原有内容,指针放在文件开头

a+

读写,不删除原有内容,指针放在文件末尾

rb、wb、ab、rb+、wb+、ab+

二进制文件操作

三 文件读写

https://www.runoob.com/python3/python3-file-methods.html

注意:这里文件读写是将文件内容作为字符串处理,而序列化、反序列化中是直接将文本转为对象

# 打开文件
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
#需要注意:mode、encoding、error三个参数
# error:当文件中出现非法编码时报错UnicodeDecodeError,可选择忽略'ignore';在爬虫中常有此问题
open('test.txt', 'r', encoding='gbk', errors='ignore')

# 关闭文件
file.close()

# 读取文件
file.read([size])				# 默认全部读取到内存;加size后读取指定字节到内存
file.readline([size])			# 读取一行
file.readlines([size])			# 读取所有行,返回list

# 写文件
file.write(str)					# 写文件只写到缓冲区了,由系统之后再写到磁盘;调用file.close才会保证全部写入磁盘
file.writelines(list)			# 写入多行,需手动写换行

# 刷新文件内部缓冲区,立刻将内部缓冲区中的数据写入磁盘
file.flush()

# 文件指针当前位置
file.tell()
# 文件指针移动,返回移动后位置
# offset以字节为单位
# whence表示偏移的基准位置;0表示文件开头,1表示当前位置,2表示文件末尾
file.seek(offset[, whence])

一个问题:file.read、file.readline、file.readlines能同时执行吗?不能,读取文件是从缓冲区中读取,读完后就没了。

with open('XXX') as file:
    file_1=file.read()
    file_2=file.read()
    print(file_1)			
    print('============================')
    print(file_2)

输出:
abc...
============================


file_2为空

四 异常处理

https://www.liaoxuefeng.com/wiki/1016959663602400/1017607179232640

由于文件打开后会占资源,且操作系统可同时打开的文件数量是有限的,因此需要关闭文件执行file.close;但是,如果文件操作过程中出错导致程序中断,会无法关闭文件,因此需要加异常处理try…finally…。
try…finally…写法比较繁琐,为了方便,python中提供了with…as…的方法,能够自动进行文件关闭,不需要手动file.close。

try:
    f = open('test.txt', 'r')
    print(f.read())
finally:
    if f:
        f.close()

with open('/path/to/file', 'r') as f:
    print(f.read())

前面讲,file.write只有在调用file.close时才会全部写入磁盘,如果程序中断会导致部分数据未写入,因此需要使用with…as…保证写入