1. 文件操作简介
使⽤python来读写⽂件是非常简单的操作. 我们使⽤open()函数来打开⼀个⽂件, 获取到⽂件句柄. 然后通过⽂件句柄就可以进⾏各种各样的操作了. 根据打开⽅式的不同能够执⾏的操作也会有相应的差异.
打开⽂件的⽅式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤的是r(只读)模式
2. 文件操作
1. 绝对路径和相对路径 (1) 绝对路径:从磁盘根⽬录开始⼀直到⽂件名. (2) 相对路径:同⼀个⽂件夹下的⽂件. 相对于当前这个程序所在的⽂件夹⽽⾔. 如 果在同⼀个⽂件夹中. 则相对路径就是这个⽂件名. 如果在上⼀层⽂件夹. 则要../
注意: 我们更推荐⼤家使⽤相对路径. 因为在我们把程序拷⻉给别⼈使⽤的时候. 直接把项⽬拷⻉走
就能运⾏. 但是如果⽤绝对路径. 那还需要拷⻉外部的⽂件.
2. r 只读 f = open("护⼠少妇嫩模.txt",mode="r", encoding="utf-8") content = f.read() # 把读取到的东西赋值给content print(content) f.close() # 关闭句柄 # 句柄可以迭代 f = open("吃的",mode="r",encoding='utf-8') for line in f: # 每次读取一行,赋值给前面的line变量 print(line) f.close() # 关闭句柄
3. w 只写
# w 操作 会清空原来的所有内容 f = open("⼩娃娃", mode="w", encoding="utf-8") f.write("⾦⽑狮王") f.flush() # 刷新管道,防止残余 f.close() # 关闭句柄
4. a 追加 # 在原来的基础上进行追加 内容 f = open("小护士模特",mode="a",encoding="utf-8") f.write("小龙女") f.flush() f.close()
5. r+ 读写(使用最多,重难点) # r+模式, 默认情况下光标在文件的开头, 必须先读后写. 注意: 1.在没有任何操作之前, 在开头写. 2. 如果读取了一些内容,再写,写入的是最后.
6. w+ 写读 # w 操作,会清空原来的内容. w+一般是不用的 f = open("亵渎",mode="w+",encoding="utf-8") f.write("今天天气") f.seek(0) # 移动光标 移动到xxx位置 s = f.read() # 写完后光标在最后面,想要读必须把光标移到前面 print(s) f.flush() f.close()
7. a+ 追加写,然后读 f = open("亵渎",mode="a+",encoding="utf-8") f.write("你在哪里啊") f.flush() # 刷新通道 f.seek(0) # 追加写完后,光标位置在最后,需要移到最前面,才能读 s = f.read() # 把读取到的内容给s f.close() # 关闭句柄 print(s)
8. b rb, wb, ab, r+b, w+b, a+b b: 输入输出的是字节. 处理非文本.
3. read详解(读取文件的方法)
# 1. read() 将⽂件中的内容全部读取出来. 弊端: 占内存. 如果⽂件过⼤.容易导致内 存崩溃 f = open("../def/哇擦.txt", mode="r", encoding="utf-8") content = f.read() print(content) # 2. read(n) 读取n个字符. 需要注意的是. 如果再次读取. 那么会在当前位置继续去 读⽽不是从头读, 如果使⽤的是rb模式. 则读取出来的是n个字节 f = open("../def/哇擦.txt", mode="r" encoding="utf-8") content = f.read(3) print(content) # 3. readline() ⼀次读取⼀⾏数据, 注意: readline()结尾, 注意每次读取出来的 数据都会有⼀个 所以呢. 需要我们使⽤strip()⽅法来去掉 或者空格 f = open("../def/哇擦.txt", mode="r", encoding="utf-8") content = f.readline() content2 = f.readline() content3 = f.readline() print(content) print(content2) print(content3) # 4. readlines()将每⼀⾏形成⼀个元素, 放到⼀个列表中. 将所有的内容都读取 出来. 所以也是容易出现内存崩溃的问题.不推荐使⽤ f = open("../def/哇擦.txt", mode="r", encoding="utf-8") lst = f.readlines() print(lst) for line in lst: print(line.strip()) # 5. 循环读取. 这种⽅式是最好的. 每次读取⼀⾏内容.不会产⽣内存溢出的问题. f = open("../def/哇擦.txt", mode="r", encoding="utf-8") for line in f: print(line.strip()) 注意: 读取完的⽂件句柄⼀定要关闭 f.close()
4. 其他相关操作
1. seek() 移动光标 # 文件的操作读写追加等,其实都是靠光标的移动才能完成. # 光标在哪里,才能从哪里开始读,从哪里开始写. 但 r+ ,是一个例外. r+ : 1.在没有任何操作之前, 在开头写(这个是正常的,因为光标最开始就在开头) 2. 如果读取了一些内容,再写,写入的是最后(这个是例外,因为正常情况下光标在哪里就应该从哪里开始写,但是这里是在最后写.) # 移动到开头: f.seek(0) 开头 # f.seek(xx) 移动到第XX个字节 # 第二个参数有三个值. 0: 在开头 1: 在当前 2: 末尾 # 移动到末尾: f.seek(0, 1) 当前 # 移动到末尾: f.seek(0, 2) 末尾 2. tell() # 使⽤tell()可以帮我们获取到当前光标在什么位置 f = open("⼩娃娃", mode="r+", encoding="utf-8") content = f.read() print(content) print(s.tell()) 深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显⽰的是多 少. 再写入或者操作⽂件的时候都是在结尾进⾏的操作. 3. truncate() 截断⽂件 f = open("⼩娃娃", mode="w", encoding="utf-8") f.write("哈哈") # 写⼊两个字符 f.seek(3) # 光标移动到3, 也就是两个字中间 f.truncate() # 删掉光标后⾯的所有内容 f.close() # 如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进⾏截断. # 关于truncate(n), 如果给出了n. 则从开头开头进⾏截断, 如果不给n, 则从当前位置截断. 后⾯的内容将会被删除
5. 修改⽂件以及另⼀种打开⽂件的⽅式
import os with open("吃的",mode="r",encoding="utf-8") as f1, open("吃的_副本",mode="w",encoding="utf-8") as f2: # s = f1.read() # ss = s.replace("肉","菜") # f2.write(ss) # 弊端: ⼀次将所有内容进⾏读取. 内存溢出. # 解决⽅案: ⼀⾏⼀⾏的读取和操作 for line in f1: s = line.replace('菜','肉') f2.write(s) os.remove("吃的") # 删除模块 os.rename("吃的_副本","吃的") # 重命名文件