目 录
一、文件的其他模式
r+ 模式
with open(r'H:PycharmProjectspy_learn.txt','r+',encoding='utf-8') as f: print(f.readable()) # 返回True 可读 print(f.writable()) # 返回True,可写 #print(f.read()) #print(f.readlines()) f.write('再见咋住咋狗!') # r+模式下的write实际上覆盖旧的数据,如果添加的字符与旧字符不统一会出现乱码
w+ 模式
with open(r'H:PycharmProjectspy_learn.txt','w+',encoding='utf-8') as f1: print(f1.readable()) print(f1.writable()) # f1.write('再见杰克!') print(f1.read()) # ????无法读出字符,文件被清空
a+ 模式
with open(r'H:PycharmProjectspy_learn.txt','a+',encoding='utf-8') as f1: print(f1.readable()) # 可读可写 print(f1.writable()) f1.write('再见我的哈鲁亚克 ')
文件非纯净模式总结:“+”模式下均可读可写。
“r+” 中写入字符会覆盖,并且是从文件的开头进行覆盖:原因是“r+”模式是从开头开始读取的,所以写入时也从开头起;
“w+”中读入字符会清空文件内容,具体原因。。????和“w”模式类似都是先清空在写入
“a+”与“a”模式一样都是尾部追加写
二、文件的光标控制
1、根据文件光标可以打印不同位置的字符:
注意:只有在rt模式下,read()括号内的整数参数才是字符的个数,除此之外都是指字节的个数
with open(r'H:PycharmProjectspy_learn.txt','r',encoding='utf-8') as f1: print(f1.read(4)) # read()后面整数是指接收4个字符 with open(r'H:PycharmProjectspy_learn.txt','rb') as f1: print(f1.read(4)) # 除了rt模式外read()后面都是指字节的个数
2、文件内光标的移动
内置方法:f.seek( offset,whence)
offset: 相对偏移量,光标移动的位数
whence:光标移动的参照物。有3种模式--
0:参照文件的开头,t和b模式下都可以用。
1:参照光标所在的当前位置,只能在b模式下用。
2:参照文件的末尾,只能在b模式下用。
rt模式下和rb模式下,seek() 和 read()方法对比:
with open(r'H:PycharmProjectspy_learn.txt','r',encoding='utf-8') as f1: print(f1.read(3)) #以文件开头为参照,移动6个字节,utf-8中3个字节代表一个中文字符,即移动两个中文字符 f1.seek(6,0) # seek 移动的都是字节数 print(f1.read(1)) # 返回一个字符 with open(r'H:PycharmProjectspy_learn.txt','rb') as f1: print(f1.read(3)) f1.seek(6,0) # 光标向右移动6个字节,再打印一个字节 print(f1.read(1)) # 返回一个字节
注意情况1:当参照 0 文件开头进行光标移动并打印后,在此执行read操作,光标默认在当前位置并进行下一次操作。
# 原文本:再见杰克wewillcome!
with open(r'H:PycharmProjectspy_learn.txt','rb') as f1: #print(f1.read(3)) f1.seek(6,0) # 光标向右移动6个字节,再打印3个字节 print(f1.read(3).decode('utf-8')) print(f1.read(3).decode('utf-8')) >>>:杰 >>>:克
注意情况2:当参照模式“2”,即文件末尾开始反向取值。
# 原文本:啦啦啦啦jason with open(r"H:PycharmProjectspy_learn.txt", 'rb') as f: f.seek(-4,2) print(f.read()) # b'ason'
由上面代码可以看出seek光标范围从末尾到-4的值,即打印后4个字符
注意情况3:当在“r+”模式时,在光标指定位置写入字符是替代
#一二三四jason with open(r"H:PycharmProjectspy_learn.txt", 'r+',encoding='utf-8') as f: f.seek(3,0) f.write('我') # 一我三四jason
三、文件内容变化监测小程序
1、写日志添加时间
import time res = time.strftime('%Y-%m-%d %X') with open(r'test1.txt','a',encoding='utf-8') as f: f.write('%s egon 给我发了工资 '%res)
2、利用文件光标监测文件内容变化
#检测文件内容 with open(r'H:PycharmProjectspy_learn est1.txt','rb') as f: f.seek(0,2) while True: data = f.readline() if data: print("新增的内容是:%s"%data.decode('utf-8'))
3、截断文件 f.truncate()
with open(r'test','a',encoding='utf-8') as f: f.truncate(6) # 接收的字节的长度 整型 # 保留0~6字节数 后面的全部删除(截断) 注意:要返回test文本查看截断结果,程序结果不显示
四、文件修改
文件的修改有两种方式:
第一种方式步骤如下:
1.先将文件有硬盘读到内存(读文件)
2.在内存中完成文件的修改(文件的替换)
3.再覆盖原来的文件(写文件)
# 河大工商是个好地方,河大的美女农大的饭! with open(r"test1.txt",'r',encoding='utf-8') as f: data = f.read() res = data.replace('河大','邮电') # data 是字符串类型不可变,所以要用一个变量名来接收 print(res) #再写入重新覆盖原来的文件内容 with open(r"test1.txt",'w',encoding='utf-8') as f: f.write(res) # 邮电工商是个好地方,邮电的美女农大的饭!
优点:硬盘中只出现一个文件,不会过多占用硬盘空间。
缺点:当文件过大时可能会导致内存溢出。
第二种文件修改方式步骤如下:
# 邮电工商是个好地方,邮电的美女农大的饭! import os # os 是操作系统的库 with open(r"H:PycharmProjectspy_learn est1.txt",'r',encoding='utf-8') as f1, open(r'H:PycharmProjectspy_learn est2.txt','a',encoding='utf-8') as f2: # 注意:新文件f2 是追加写‘a’模式,因为是循环读取文件并追加写到新文件中 for line in f1: new_line = line.replace('地方','学校') # line是字符串类型不可变,需要一个变量名来接收 f2.write(new_line) os.remove('test1.txt') os.rename('test2.txt','test1.txt') # 邮电工商是个好学校,邮电的美女农大的饭!
优点:内存中始终只有一行内容,不占内存,不会导致内存溢出。
缺点:在某一时间硬盘上会同时出现两个文件夹。
五、函数简介
1、函数的定义:函数是一个工具,哪里需要哪里搬。
函数体内代码定义截断,只检测语法,不执行代码。函数四部分如图:
2、函数的执行流程如图所示:
注意:函数体内的代码,如果不调用的话是不执行的!!!
总结函数前戏如下:
a、函数名的命名规则和变量一样,函数就是工具,必须先定义在调用(函数名+括号)
b、函数和变量区别:通过变量名可找到变量对应的值;通过函数名+括号,可找到函数体所对应的代码并执行