一.文件模式补充
r+ 不会创建文件的可读可写
with open("a.txt", 'r+', encoding="utf-8") as f : print(f.readable()) print(f.writable()) print(f.readline()) print(f.write("zazaza"))
w+ 创建清空文件的可读可写
with open("a.txt", 'w+', encoding="utf-8") as f : print(f.readable()) print(f.writable()) print(f.readline()) print(f.write("zazaza"))
a+ 创建不清空文件(追加)的可读可写
with open("a.txt", 'a+', encoding="utf-8") as f : print(f.readable()) print(f.writable()) f.seek(0,0) print(f.readline()) # 光标在末尾 print(f.write("zazaza "))
二.光标移动
光标f.seek(offset,whence)
offset:相对偏移量 光标移动的位数
whence: 0:参照文件的开头 t和b都可以使用
1:参照光标所在的当前位置 只能在b模式下用
2:参照文件的末尾 只能在b模式下使用
with open("a.txt", 'rb') as f : print(f.read(3).decode("utf-8")) f.readline() f.seek(0,1) f.read(2) f.seek(-4,2) print(f.read(2))
三.检测文件内容的变化及截断函数
将光标移动的文件的末尾
可以通过seek来进行光标移动,也可以通过a+b直接把光标定位到末尾
让后通过while循环,把光标之后的内容赋值,非空就打印出来
with open(r'a.txt','a+b') as f: # 先将光标移动到文件末尾 # f.seek(0,2) while True: res = f.readline() print(f.tell()) # 查看光标移动了多少位 bytes if res: print("新增的文件内容:%s"%res.decode('utf-8'))
truncate截断函数:把指定长度后面的文件内容删除
with open("a.txt", 'a+', encoding="utf-8") as f : f.truncate(10)
四.修改文件的两种方式
修改文件
先将数据由硬盘读到内存(读文件)
在内存中完成修改(字符串的替换)
再覆盖原来的内容(写文件)
with open(r"a.txt", "rt",encoding="utf-8") as f : str1 = f.read().upper().replace("炸","渣") with open(r"a.txt", "wt",encoding="utf-8") as f : f.write(str1)
优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
缺点:当文件过大的情况下,可能会造成内存溢出
文件修改方式2
创建一个新文件
循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中
将老文件删除 将新文件的名字改成老文件名
import os with open(r"a.txt", "rt",encoding="utf-8") as f, open(r"a.swap","at",encoding="utf-8") as write_f : for line in f : str1 = line.replace("渣",'炸') str1 = str1.lower() write_f.write(str1) os.remove("a.txt") os.rename("a.swap","a.txt")
优点:内存中始终只有一行内容 不占内存
缺点:再某一时刻硬盘上会同时存在两个文件
五.函数简介
函数: (1)重复利用的工具
(2)可以完成特定功能的代码块,函数就是存放代码块的容器
函数必须先声明再调用(函数名+括号)。
函数包括四部分
1. 函数名:使用该函数的依据 (函数名的命名规则跟变量名一模一样)
2. 函数体:完成功能的代码块(函数体代码定义截断只检测语法 不执行代码)
3. 返回值:功能完成的反馈结果
4. 参数:完成功能需要的条件信息
def my_max(x,y) : if x > y : return x else :return y print(my_max(my_max(3,2),1))