一、控制文件操作的模式之x模式
1、作用:只新写模式,不可读,若声明的文件存在,则报错,不存在则新建并可写入。
2、应用场景:此操作模式下可以防止因文件路径或文件输错导致重要数据被清除。
with open(r'02 演示x模式.txt', mode='xt', encoding='utf-8')as sql1:
pass
# 第一次进行x模式的操作,因为声明的文件不存在,则会创建该文件
with open(r'02 演示x模式.txt', mode='xt', encoding='utf-8')as sql2:
pass
# 第二次进行x模式的操作,因为声明的文件已存在,会报错
二、控制文件内容的模式之b模式
1、全称位binary模式,有如下几点特性(与t模式比较):
①数据传输都是以Bytes为单位(内存与硬盘互传时会自动转码)。
with open(r'03 t模式内容.txt', mode='rt', encoding='utf-8')as x:
x0 = x.read()
print(type(x0)) # 结果为str类型
with open(r'04 b模式内容.jpg', mode='rb')as y:
y0 = y.read()
print(type(y0)) # 结果为bytes类型
②可以针对所有文件(只能针对文本文件)。
with open(r'04 b模式内容.jpg', mode='rt', encoding='utf-8')as x:
x.read() # 用t模式读取图片,会报错
③一定不能指定字符编码,即不能声明encoding的参数(必须指定字符编码,即必须声明encding的参数)。
with open(r'04 b模式内容.jpg', mode='rb',encoding='utf-8')as y:
pass # 在b模式下指定字符编码,会报错
④与t模式相比小结:
Ⅰ:在操作纯文本文件的情况下,t模式帮我们省去了转码环节,b模式则需要手动操作,这种情况下t模式更方便。
Ⅱ:在非纯文本模式下(视频,图片,音频等)只能使用b模式。
三、read可以声明参数指定读出的数据数量
1、作用:read功能不指定参数的情况下会一次读出文件所有内容,此时若文件过大会瞬间占用很大内存,为应付这种情况,可对read功能指定数量参数,此数量单位时Bytes。
with open(r'05 read较多内容.txt', mode='rt', encoding='utf-8')as sql:
sql_0 = sql.read()
print(sql_0) # 文件内容一次性读出,瞬间占用大量内存
with open(r'05 read较多内容.txt', mode='rt', encoding='utf-8')as sql:
for sql_0 in sql:
print(sql_0) # 使用for循环遍历文件内容,每次遍历的内容数量以换行符为界,即实现了逐行读取
with open(r'05 read较多内容.txt', mode='rt', encoding='utf-8')as sql:
while True:
sql_0 = sql.read(11)
print(sql_0)
if len(sql_0) == 0:
break # 使用while循环,每次循环读出11个Bytes的内容(换行符占一个Bytes),根据判断每次读出的内容数量是否为0来结束循环,即实现了每次定量读取
四、文件操作的其他相关功能
1、readline:一次读一行。
with open(r'06 一次读一行.txt', mode='rt', encoding='utf-8')as sql: sql1 = sql.readline() sql2 = sql.readline() sql3 = sql.readline() print(sql1) print(sql2) print(sql3) # 每次读出不再是文件所有内容,而是对应行的整行内容
2、readlines:逐行读出,并把每行内容为单个元素组成列表。
with open(r'06 一次读一行.txt', mode='rt', encoding='utf-8')as sql: sql_list = sql.readlines() print(sql_list) # 结果为 ['aaa\n', 'bbb\n', 'ccc\n']
3、read与readlines使用注意:都是将内容一次性读入内存,所以使用时都应该注意文件内容大小,避免文件过大对内存造成的瞬间负担。
4、writelines:多次连续写入。
with open(r'07 分行写入.txt',mode='wt',encoding='utf-8')as sql: sql.write('aaa\nbbb\nccc\n') # 可以采用内嵌换行符\n的方式把整个字符串的内容分行写入文件 with open(r'07 分行写入.txt', mode='wt', encoding='utf-8')as sql: l = ['aaa\n', 'bbb\n', 'ccc\n'] sql.writelines(l) # 把每行内容加上换行符为元素组成列表,实现分行写入
5、b模式下写入:需要先转成bytes类型。
with open(r'08 b模式写入',mode='wb')as sql: sql.write('aaa') # b模式写不能把str格式的内容直接写入文件,会报错 with open(r'08 b模式写入',mode='wb')as sql: sql.write(b'aaa') sql.write('bbb'.encode('utf-8')) sql.write(bytes('ccc',encoding='utf-8')) # 三种方式都相当于把输入内容先编码成了utf-8格式
6、flush:立刻存入。
with open(r'09 立刻存入.txt', mode='wt', encoding='utf-8')as sql: sql.write('你好') # 对操作系统而言,执行到此行代码时,有时并不会马上将此内容存入硬盘,而是基于某种机制暂存某处,等从各个程序中收集到的需存数据达到一定量时再统一存入硬盘,此机制意在减少内存与硬盘的IO次数 sql.flush() # 此行代码会使操作系统让内存立刻把本程序上面代码的写入存入硬盘,不管是否已有一定数量的数据
7、其他功能:
with open(r'10 其他功能.txt', mode='wt', encoding='utf-8')as sql: print(sql.readable()) # 是否可读,此处为 False print(sql.writable()) # 是否写,此处为 True print(sql.encoding) # 使用何种编码,此处为 utf-8 print(sql.name) # 文件名,此处为 10 其他功能.txt print(sql.closed) # 文件是否关闭,此处为 False
五、文件高级操作之指针移动
1、指针移动单位:
①大部分情况下指针移动都是以Bytes为单位。
②只有在t模式下以字符为单位。
2、指针移动之tell功能:返回值当前指针位置。
3、指针移动之seek功能:seek功能分0/1/2三种模式,分别代表指针的起始位置为,开头/当前位置/末尾。只有0模式可以在t模式下使用。其他模式只支持b模式。
with open(r'11 指针移动(一共16个数字字母).txt', mode='rb')as sql: sql.seek(5, 0) print(sql.tell()) # 结果为 5 sql.seek(6, 1) print(sql.tell()) # 结果为 11 sql.seek(-4, 2) print(sql.tell()) # 结果为12