今日主要内容
-
文件操作
- 文件路径
- 打开方式
- 编码方式
- 文件句柄
- 文件修改
一、文件操作
(一)文件操作的用途
- 我们运行代码时产生的数据和记录,存储在内存中,当程序运行完,产生的数据和记录就会被释放掉,如果我们需要这个数据或记录以便下次使用,那就需要用文件存储起来(如商城的购买记录等)
- 文件操作用于: 持久化存储数据
-
文件操作的三步骤:
- 打开文件
- 操作文件
- 关闭文件
(二)文件操作的格式
-
f = open(文件路径, 打开方式, 编码方式)
f = open("text.txt", mode="r", encoding="utf-8") """文件操作""" f.close()
-
with open(文件路径, 打开方式, 编码方式) as f:
- 以此方式打开文件不需要手动关闭文件,自动关闭
-
可以打开多个文件
-
with open(...) as f1, open(...) as f2:
-
with open("text.txt", mode="r", encoding="utf-8") as f: """文件操作"""
(三)文件路径
- 文件路径:文件所在的位置
- 分为 绝对路径 和 相对路径
-
绝对路径:
- 从磁盘根目录一直到文件名的路径
path = "C:\Users\11582\Desktop\笔记\day08"
-
相对路径
-
同一个文件夹下的文件,如果在同一个文件夹,那么相对路径就是这个文件名,如果在上一层文件夹则需要:
../
path = "../装饰器/测试.txt"
-
同一个文件夹下的文件,如果在同一个文件夹,那么相对路径就是这个文件名,如果在上一层文件夹则需要:
-
转义:
-
用两个
\\
代表 -
路径前加一个r
path = r"C:\Users\11582\Desktop\笔记\day08"
-
用两个
(四)打开方式
-
mode可以省略,直接填入打开方式,若不填默认为只读"r"
-
r 只读 w 只写(清空写) a 追加(追加写) rb 以字节方式打开文件用于只读 wb 以字节方式打开文件用于只写(清空写) ab 以字节方式打开文件用于追加(追加写) r+ 读写 w+ 写读(清空写) a+ 追加写读(追加写) r+b 以字节方式打开文件用于读写 w+b 以字节方式打开文件用于写读(清空写) a+b 以字节方式打开文件用于追加(追加写)
-
mode="r"
- 以只读方式打开文件
- 默认参数为只读"r"
- 文件读取得到的是字符串
f = open("text.txt", "r", encoding="utf-8") s = f.read() f.close() print(s) # 打印文件内容
-
mode="w"
- 以只写方式打开文件
- 文件打开时清空文件,之后写入内容
- 若文件不存在创建文件
- 只能写入字符串
f = open("text.txt", "w", encoding="utf-8") f.write("文件操作") f.flush() f.close() # 写入"文件操作"
-
mode="a"
- 以追加方式打开文件,可以在文件末尾追加写入内容
f = open("text.txt", "a", encoding="utf-8") f.write("文件操作") f.flush() f.close() # 在文件末尾写入"文件操作"
-
mode="rb"
- 以字节方式打开文件用于只读
- 一般用于打开非文本文件,如图片、音频、视频等
- 以"rb"方式打开文件不能输入编码方式,输入会报错
f = open("LOL.jpg", "rb") s = f.read() f.close() print(s) # 打印文件内容(二进制码)
-
mode="wb"
- 以字节方式打开文件用于只写
- 文件打开时清空文件,之后写入内容
- 若文件不存在创建文件
- 只能写入字符串
f = open("LOL.jpg", "rb") s = f.read() f.close() f = open("皮肤.png", "wb") f.write(s) f.flush() f.close()
-
mode="ab"
- 以字节方式打开文件用于追加,可以在文件末尾追加写入内容
f = open("LOL.jpg", "rb") s = f.read() f.close() f = open("LOL.jpg", "ab") f.write(s) f.flush() f.close()
-
mode="r+"
- 以读写方式打开文件,先读后写
- 无论读到哪个字符,写都从文件最后开始写入
- 若先写入,则会覆盖文件不会清空,按照对应字节数覆盖
f = open("text.txt", "r+", encoding="utf-8") s = f.read() f.write("文件操作") # 在文件末尾追加"文件操作" f.flush() f.close() print(s)
f = open("text.txt", "r+", encoding="utf-8") f.write("123") # 将文件中的"文"替换成"123" 一个中文对应三个字节 f.flush() f.close()
-
mode="w+"
- 以写读方式打开文件
- 因为打开的时候清空文件,无论先写后读,还是先读后写,都无法读到内容,所以一般很少用
f = open("text.txt", "w+", encoding="utf-8") f.write("文件操作") f.flush() f.close()
-
mode="a+"
- 以追加写读方式打开文件
- 在文件末尾追加
f = open("text.txt", "a+", encoding="utf-8") s.seek(0) s = f.read() f.write("文件操作") f.flush() f.close()
-
mode="r+b"
- 以字节方式打开文件用于读写
-
mode="w+b"
- 以字节方式打开文件用于写读
-
mode="a+b"
- 以字节方式打开文件用于追加写读
(五)编码方式
- 编码方式决定文件的读写以何种方式进行编码
- windows使用的编码方式是GBK(终端)
- Pycharm使用的是编码方式是UTF-8
- 打开方式所有以 字节打开 打开的都不能填入编码方式
(六)文件句柄
-
用来操作文件的媒介,文件操作的所有方法都针对于文件句柄
-
文件句柄是一个迭代器,可以进行for循环
-
f.read() 读取全部内容 f.readline() 读取一行内容 f.readlines() 读取全部内容 f.close() 关闭文件 f.write() 写入内容 f.flush() 刷新内容 f.seek() 移动光标 f.tell() 获取光标位置 f.truncate() 截断文件
-
f.read()
- 读取文件全部内容
- 弊端:如果文件过大,导致内存崩溃
-
read(n)
方法可填入参数n,读取n个字符
f = open("text.txt", "r", encoding="utf-8") s = f.read(3) # 读取前3个字符 s1 = f.read() # 读取剩余全部内容 f.close()
-
f.readline()
- 读取文件一行内容
-
末尾带一个换行符,可以利用
strip()
删除
f = open("text.txt", "r", encoding="utf-8") s = f.readline() # 读取文件一行内容 f.close()
-
f.readlines()
- 读取文件全部内容,将每一行的内容放在一个列表中
- 每一行内容为一个字符串,末尾带一个换行符
f = open("text.txt", "r", encoding="utf-8") s = f.readlines() # 读取文件全部内容,得到一个列表 f.close()
- 注意:文件读取的结果为字符串类型
-
f.close()
- 关闭文件
- 文件句柄在操作完一定要关闭
f = open("text.txt", "r", encoding="utf-8") s = f.read() f.close() # 关闭文件句柄
-
f.write()
- 向文件中写入内容
- 若文件存在,先清空文件后写入(执行open的时候就已经清空文件了)
- 若文件不存在,新建文件后写入
f = open("text.txt", "w", encoding="utf-8") f.write("文件操作") # 写入"文件操作" f.flush() f.close()
- 注意:文件只能写入字符串,写入其他类型数据会报错
-
f.flush()
- 刷新缓冲区,立刻写入磁盘
-
延申:缓冲区与缓存
-
缓冲区:
- 首先缓冲区是内存空间的一部分,在内存空间中预留了一定的存储空间,这些空间用来暂时存储输入或输出的数据
- 缓冲区的存在是因为硬件间存在速度差(比如内存和CPU之间、CPU和硬盘之间)高速硬件会等待低速硬件,这时需要一个缓冲区来平衡
-
缓存:
- 缓存存在于CPU中,由于CPU运行速度远大于内存的速度,为了避免频繁的向内存读取数据,将一部分数据存在缓存中,CPU需要使用的时候不需要再访问内存
- 总结:缓冲区偏重于写,缓存偏重于读
-
缓冲区:
f = open("text.txt", "w", encoding="utf-8") f.write("文件操作") f.flush() # 刷新缓冲区 f.close()
-
f.seek()
- 移动光标,文件的读写依靠光标进行
-
seek()
方法有两个参数:- 第一个参数为移动到的位置
-
第二个参数为光标从那个位置开始移动
- 0:同开头开始移动
- 1:从当前位置移动
- 2:从结尾开始移动
- 当第二个参数不为0时,第一个参数必须为0
- 光标移动的单位为字节,如果文本为中文,移动一个字符需要移动三个字节
f = open("text.txt", "r", encoding="utf-8") f.read() f.seek(0) # 光标移动到开头 f.read() f.close()
-
f.tell()
- 获取光标当前位置
f = open("text.txt", "r", encoding="utf-8") f.read() f.seek(0) # 光标移动到开头 s1 = f.tell() # 开头位置 f.read() s2 = f.tell() # 结尾位置 f.close()
-
f.truncate()
- 截断文件,删除光标后面所有内容
- 截断文件之前必须要移动光标,否以无法截断
f = open("text.txt", "r", encoding="utf-8") f.read() f.seek(3) f.truncate() # 第三个字符后面的内容全部被删除 f.close()
二、文件修改
-
文件修改只能将原文件内容读取到内存中,将信息修改完毕之后,写到新的文件中,将原文件删除,并将新文件重命名成原文件的名字
-
需要导入os模块用来删除文件和重命名文件
import os with open("text.txt", "r", encoding="utf-8") as f1,\ open("text副本.txt", "w", encoding="utf-8") as f2: for line in f1: new_line = line.replace("旧内容", "新内容") f2.write(new_line) os.remove("text.txt") # 删除原文件 os.rename("text副本.txt", "text.txt") # 重名命成原文件