本节主要内容:
1. 初识⽂文件操作
2. 只读(r, rb)
3. 只写(w, wb)
4. 追加(a, ab)
5. r+读写
6. w+写读
7. a+写读(追加写读)
8. 其他操作⽅方法
9. ⽂文件的修改以及另⼀一种打开⽂文件句句柄的⽅方式
一初识文件操作
使⽤用python来读写⽂文件是⾮非常简单的操作. 我们使⽤用open()函数来打开⼀一个⽂文件, 获取到⽂文
件句句柄. 然后通过⽂文件句句柄就可以进⾏行行各种各样的操作了了. 根据打开⽅方式的不同能够执⾏行行的操
作也会有相应的差异.
打开⽂文件的⽅方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤用的是r(只读)模式
二只读操作
r 模式和rb模式
f = open('护士少妇嫩模.txt',mode='r',encoding='utf-8')#文件存储的地方,模式,编码模式 content = f.read()#read需要返回值,注意read输入字符长度,换行也算一个字节 print(content) f.close()#使用这种模式必须要加close,fulsh. f = open('护士少妇嫩模',mode='rb')#b模式下不需要加编码模式 content = f.read() print(content) f.close()
绝对路径:从磁盘根目录开始寻找
相对路径:同一文件下的寻找,可以是以此文件夹为基础,进行上下级的获取. 推荐使用
read readline readlines 读取几个字节 读取一行 全部读取 外加for循环,推荐for循环
f = open('a4',mode='r',encoding='utf-8') content = f.read()#默认全部度取,加数字为几个字节 print() f = open('a4',mode='r',encoding='utf-8') f1 = f.readline()#读取几行 print(f1) f = open('a4',mode='r',encoding='utf-8') f1 = f.readlines()#全部读取,为列表 print(f1) f = open('a4',mode='r',encoding='utf-8') for s in f: print(s)#推荐使用
三 写 模式
w wb
写的时候注意. 如果没有⽂文件. 则会创建⽂文件, 如果⽂文件存在. 则将原件中原来的内容删除, 再
写入新内容
f = open('小娃娃',mode='w',encoding='utf-8') f.write('金毛狮王') f.flush() f = open('小娃娃',mode='wb') f.write('金毛狮王'.encode('utf-8')) f.flush() f.close()
四追加模式
f = open('小娃娃',mode='a',encoding='utf-8') f.write('马化腾') f.flush() f.close()
五读写模式
r+ r+b读写模式是使用最高的
先读后写,负责要进行光标的移动
f = open("⼩小娃娃", mode="r+", encoding="utf-8") content = f.read() f.write("麻花藤的最爱") print(content) f.flush() f.close()
w+ w+b和a+
f = open("⼩小娃娃", mode="w+", encoding="utf-8") f.write("哈哈") content = f.read() print(content) f.flush() f.close() f = open("⼩小娃娃", mode="a+", encoding="utf-8") f.write("⻢马化腾") content = f.read() print(content) f.flush() f.close()
其他操作
seek tell truncate
1. seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中⽂文部分要
是3的倍数.
通常我们使⽤用seek都是移动到开头或者结尾.
移动到开头: seek(0)
移动到结尾: seek(0,2) seek的第⼆二个参数表⽰示的是从哪个位置进⾏行行偏移, 默认是0, 表
⽰示开头, 1表⽰示当前位置, 2表⽰示结尾
f = open('小娃娃',mode='r+',encoding='utf-8') f.seek(0) content = f.read() print(content) f.seek(0) f.seek(0,2) content2 = f.read() print(content2) f.seek(0) f.write('张国荣') f.flush() f.close()
f = open("⼩小娃娃", mode="r+", encoding="utf-8") f.seek(0) # 光标移动到开头 content = f.read() # 读取内容, 此时光标移动到结尾 print(content) f.seek(0) # 再次将光标移动到开头 f.seek(0, 2) # 将光标移动到结尾 content2 = f.read() # 读取内容. 什什么都没有 print(content2) f.seek(0) # 移动到开头 f.write("张国荣") # 写⼊入信息. 此时光标在9 中⽂文3 * 3个 = 9 print(f.tell()) # 光标位置9 f.flush() f.close()
f = open("⼩小娃娃", mode="w", encoding="utf-8") f.write("哈哈") # 写⼊入两个字符 f.seek(3) # 光标移动到3, 也就是两个字中间 f.truncate() # 删掉光标后⾯面的所有内容 f.close() f = open("⼩小娃娃", mode="r+", encoding="utf-8") content = f.read(3) # 读取12个字符 f.seek(4) print(f.tell()) f.truncate() # 后⾯面的所有内容全部都删掉 # print(content) f.flush() f.close()
深坑请注意: 在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显⽰示的是多少. 再写入
或者操作⽂文件的时候都是在结尾进⾏行行的操作.所以如果想做截断操作. 记住了了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进⾏行行截断
关于truncate(n), 如果给出了了n. 则从开头开头进⾏行行截断, 如果不给n, 则从当前位置截断. 后⾯面
的内容将会被删除
修改文件
# ⽂文件修改 import os with open("⼩小娃娃", mode="r", encoding="utf-8") as f1, open("⼩小娃娃_new", mode="w", encoding="UTF-8") as f2: content = f1.read() new_content = content.replace("冰糖葫芦", "⼤大⽩白梨梨") f2.write(new_content) os.remove("⼩小娃娃") # 删除源⽂文件 os.rename("⼩小娃娃_new", "⼩小娃娃")
#弊端: ⼀一次将所有内容进⾏行行读取. 内存溢出. 解决⽅方案: ⼀一⾏行行⼀一⾏行行的读取和操作 import os with open("⼩小娃娃", mode="r", encoding="utf-8") as f1, open("⼩小娃娃_new", mode="w", encoding="UTF-8") as f2: for line in f1: new_line = line.replace("⼤大⽩白梨梨", "冰糖葫芦") f2.write(new_line) os.remove("⼩小娃娃") # 删除源⽂文件 os.rename("⼩小娃娃_new", "⼩小娃娃") # 重命名新⽂文件