文件操作
一文件操作
使用open()函数来打开一个文件,
打开文件的方式:
r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b.默认使用的是r(只读模式)
二.只读操作
1.
f = open("a1.txt",mode="r",encoding="utf-8") content = f.read() print(content) f.close()
需要注意encoding表⽰编码集. 根据⽂件的实际保存编码进⾏获取数据, 对于我们⽽⾔. 更
多的是utf-8.
2.rb读出来的数据是bytes类型,在rb模式下.不能选择encoding字符集
f = open("a1.txt",mode="r") content = f.read() print(content) f.close()
rb的作⽤: 在读取非⽂本⽂件的时候. 比如读取MP3. 图像. 视频等信息的时候就需要⽤到
rb. 因为这种数据是没办法直接显⽰出来的. 在后⾯我们⽂件上传下载的时候还会⽤到. 还有我们看到的直播
3.绝对路径和相对路径:
(1)绝对路径:从磁盘根目录开始一直到文件名
(2)相对路径:同一个文件夹下的文件,相对于当前程序所在文件夹而言,如果在同一文件夹中,则相对路径就是这个文件夹名.如果在上一层文件夹,则要../
推荐使用相对路径.因为在我们把程序拷贝给别人使用时,直接把项目拷走就能运行.但用绝对路径还需要拷贝外部文件.
三.读取文件的方法:
1.read()将文件中的内容全部读取出来.弊端,占内存.如果文件过大容易导致内存崩溃
f = open("a1.txt", mode="r", encoding="utf-8") s = f.read() print(s) f.close() 结果: 老男孩是最好的培训机构, 全心全意为学生服务, 只为学生未来,不为牟利。 我说的都是真的。哈哈
2.read(n)读取n 个字符,需要注意的是,如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式,则读取出来的是n个字节
f = open("a1.txt", mode="r", encoding="utf-8") s = f.read(3) print(s) f.close() 结果: 老男孩
f = open("a1.txt", mode="r", encoding="utf-8") s = f.read(3) s2 = f.read(3) print(s) print(s2) f.close() 老男孩 是最好
3.readline()一次读取一行数据,注意:readline()结尾,注意每次读取出来的数据都会有一个\n所以呢,需要我们使用strip()来去掉\n或者空格
4.readlines()将每一行形成一个元素,放在一个列表中.将所有内容都读取出来,所以也是容易内存崩溃的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
f = open("../def/哇擦.txt", mode="r", encoding="utf-8") lst = f.readlines() print(lst) for line in lst: print(line.strip())
5.循环读取.这种方式是组好的,每次读取一行内容,不会产生内存溢出的问题
f = open("a1.txt", mode="r", encoding="utf-8") for line in f: print(line.strip())
注意读取完文件的句柄一定要关闭f.close()
四.
写模式(w,wb)
写的时候注意,如果没有文件.则会创建文件,如果文件存在,则将原件中原来的内容删除,在写入新内容
wb模式下.可以不指定打开文件的编码.但是在写文件的时候必须将字符串转化成utf-8的bytes数据
五.追加(a,ab)
在追加模式下.我们写入的内容会追加在文件的结尾
f = open("小娃娃", mode="a", encoding="utf-8") f.write("麻花藤的最爱") f.close
六.读写模式(r+,r+b)
对于读写模式.必须先读.因为默认光标是在开头的.准备读取的.当读完了之后再进行写入,我们使用的频率最高的是r+
f = open("⼩娃娃", mode="r+", encoding="utf-8") content = f.read() f.write("麻花藤的最爱") print(content) f.close() 结果: 正常的读取之后, 写在结尾
r+模式下. 必须是先读取. 然后再写入
七.写读(w+ w+b)
先将所有的内容清空,然后写入.最后读取.但读取的内容是空的,不常用
八追加读(a+)
a+模式下,不论先读还是后读.都读取不到数据的.
f = open("⼩娃娃", mode="a+", encoding="utf-8") f.write("⻢化腾") content = f.read() print(content) f.close
九.其他相关操作
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("张国荣") # 写⼊信息. 此时光标在9 中⽂3 * 3个 = 9 f.close()
2.tell() 使用tell()可以帮我们获取当前光标位置
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.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", "⼩娃娃") # 重命名新⽂件