day08-文件的基本操作
文件操作
初识文件操作
我们使用open函数打开文件,获取到文件句柄,通过文件句柄就可以进行各种各样的操作。
只读操作(r,rb)
f = open("歌姬",mode="r",encoding="utf-8") s = f.read() f.close() # 关闭句柄 print(s)
mode表示的是文件的操作类型,encoding表示编码集(可以不写,默认utf-8)
rb读取出来的数据是bytes类型的,在rb模式下,不能选择编码集。
rb作用:可以读取非文字对象的数据。
读取文件的方法
read() 一次性全部读取,占内存,如果文件过大,内存会崩溃,不推荐
read(n)读取n个字符,如果再次读取,会从当前位置继续读。如果使用rb模式,则读取的是n个字节
readline()一次读取一行数据,末尾会有个\n,使用strip()或者切片来去掉
readlines()将每一行形成一个元素,放到一个列表,所以读取出来的是个列表。容易出现内存崩溃。
for line in f: 循环读取,每次读取一行内容,不会产生内存溢出的现象。
读取完的文件句柄一定要关闭 f.close()
写模式(w, wb)
写的时候注意,如果没有创建文件,则创建文件,如果已经创建文件,则会清空这个文件,然后写入新内容。
追加(a, ab)
只要是a或者ab,a+都是在文件的末尾写入新内容,不论光标在任何位置。
读写模式(r+,r+b)
必须是先读,后写。
1 f = open("⼩小娃娃", mode="r+", encoding="utf-8") 2 content = f.read() 3 f.write("麻花藤的最爱") 4 print(content) 5 f.flush() #刷新 6 f.close() 结果: 正常的读取之后, 写在结尾
写读模式(w+,w+b)
先将所有内容清空 ,然后写入,最后读取。
f = open("⼩小娃娃", mode="w+", encoding="utf-8") f.write("哈哈") content = f.read() print(content) f.flush() f.close()
其他相关操作
1.seek(n)操作:光标移动到n位置。移动的单位是bytes,所以utf-8的中文必须是3的倍数。
移动到开头:seek(0)
移动到结尾:seek(0,2)seek的第⼆二个参数表⽰示的是从哪个位置进⾏行行偏移, 默认是0, 表 ⽰示开头, 1表⽰示当前位置, 2表⽰示结尾
tell() 使⽤用tell()可以帮我们获取到当前光标在什什么位置
truncate() 截断文件 ,删除光标后面的所有内容。一般和seek搭配应用。
深坑请注意: 在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显⽰示的是多少. 再写入 或者操作文件的时候都是在结尾进行的操作.所以如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行截断 关于truncate(n), 如果给出了了n. 则从开头进⾏截断, 如果不给n, 则从当前位置截断. 后⾯ 的内容将会被删除
修改文件以及另一种打开文件的操作
import os # 创建新文件用来保存修改后的内容 with open("sb","r+") as f,\ open("sb_new","w") as f2: for line in f: new_comment = line.replace("alex","sb") f2.write(new_comment) os.remove("sb") # 将新文件重命名成要修改的文件名,相当于对这个文件进行了修改. os.rename("sb_new","sb")
不需要关闭句柄。