文件读写、文件的相关知识点
文件读写、文件的相关知识点
文件读写
模式 | 描述 |
---|---|
r | 只能读方式打开文本文件,不能写文件,文件路径必须存在 |
w | 只能写方式打开文本文件,不能读文件,文件路径不存在则创建 |
a | 打开文本文件在末尾追加内容,文件路径不存在则创建,文件路径存在清空原本内容 |
t | 默认的文本模式 |
rb | 以二进制格式打开文件只能读取内容,不能写内容。 |
wb | 以二进制格式打开文件只能写内容,不能读取,文件路径不存在则创建 |
ab | 以二进制格式打开文件在末尾追加内容,文件路径不存在则创建 |
x | 写模式,新建一个文件,如果该文件已存在则会报错 |
r+ | 打开文件用于读写 |
w+ | 打开文件用于读写,文件路径不存在则会创建,文件路径存在清空原本内容,写入新的内容 |
a+ | 打开文件用于在末尾追加内容,文件路径不存在则创建,文件路径存在则会在末尾追加内容 |
1、读:read()
一次性可全部读取文件内容并且光标会停留在文件末尾,继续则返回的值为空。且可在read()括号内加入要读取的字符的个数或字节的个数。当文件路径不存在时,会报错。
# 读取一次后不能再次读取,读取会将光标停留在内容末尾,因为第一次读取后光标移至末尾,光标后面没有内容了,所有读取不了
with open(r'a.txt', 'r', encoding='utf8') as f1:
data = f1.read()
print(data)
data1 = f1.read()
print(data1)
2、写:write()
写入内容到文件中,要注意的是写入的字符串也可以是二进制数据。且write()方法不会在字符串的结尾自动加上换行符。
# 只写入内容,清除原来的内容
with open(r'a.txt', 'w', encoding='utf8') as f1:
f1.write('今天不适合出门\n')
f1.write('因为今天太热了\n')
3、open()、close()
open()方法可打开多个文件,open括号里面有三个值,分别是文件路径、何种方式(读或写或追加)、最后是编码encoding。但是如果是二进制的模式下,编码encoding不用写。close()是通过代码关闭文件,避免内存的占用。用with open() as 变量名:方式程序会自动关闭文件。
with open(r'a.txt', 'r', encoding='utf8') as f1, open(r'b.txt', 'r', encoding='utf8') as f2,open(r'c.txt', 'r', encoding='utf8') as f3:
pass
4、readline()、readlines()
readline()读取文件时是一次只读一行内容,除了用文本方式打开文件读外也可以读取二进制方式打开文件,但读取的数据返回的是bytes类型,若有中文使用GBK模式解码。
readlines()读取文件是一次读取多行数据,并存放人一个列表中,官方文档说可用于控制读取的行数,如果总行数数量超出了参数指定的大小,只会读取该参数指定的大小。
# 一次仅读取一行内容
with open(r'a.txt', 'r', encoding='utf8') as f1:
data = f1.readline()
print(data) # 今天天气好热
data1 = f1.readline()
print(data1) # 浩哥说有大风
# 一次读取多行内容,以列表的形式输出返回,且会出现有换行符(内容换行)
with open(r'a.txt', 'r', encoding='utf8') as f1:
data = f1.readlines()
print(data) # ['今天天气好热\n', '浩哥说有大风\n', '我被写入了哦']
data1 = f1.readlines()
print(data1) # []
5、writeline()
可写入多行数据值,将数据值存放在容器类型中,如列表、字典、集合等。
# 可填写多行内容,存放在列表、字典、集合、元组(容器类型)
with open(r'a.txt', 'w', encoding='utf8') as f1:
f1.writelines(['今天不适合出门\n', '因为今天太热了\n'])
f1.flush() # 保存文件
4、其它方法
1.获取文件描述符fileno
调用语法:fileno()
功能:如果文件存在则返回文件对应的底层文件描述赋值,为一个整数
2.缓存写入存储清空缓存flush
调用语法:flush()
功能:将文件缓存写入存储
3.判断文件是否可交互isatty
调用语法:isatty()
功能:判断文件是否可以交互操作,如终端输入设备是可以的
4.判断文件是否可读、可写
调用语法:readable()、writeable()
功能:判断文件是否可读、可写
5.判断文件是否支持随机访问seekable
调用语法:seekable()
功能:判断文件是否支持随机访问
6.调整文件大小truncate
调用语法:truncate()
功能:将文件调整为size指定大小写字节数,注意文件必须是以写模式打开。
文件内光标的移动
当我们读取文件内容时,光标会随着读取内容的结束移至到内容的末尾。但是有几种方式可以使文件内的光标随着我们的指令移动。
1.在文本模式中read()读取文件的内容时,括号里可添加要读取的字符个数,但是要注意的是,换行也算一个字节。且读取的内容会将换行符所体现的形式表现出来(换行)。
with open('a.txt', 'r', encoding='utf8') as read_f1:
data1 = read_f1.read(4)
print(data1) # 少说点话
data2 = read_f1.read(5)
print(data2) # 多点学习 这句话前面用了一个换行符
2.在二进制模式中read()读取的内容时在括号可添加要读取的字节个数,英文字母一个字节,汉字三个字节起步。二进制模式中换行符算两个字节,并且将换行符所体现的形式表现出来(换行)。
with open('a.txt', 'rb') as read_f1:
data1 = read_f1.read(12)
print(data1.decode()) # 少说点话
data2 = read_f1.read(5)
print(data2.decode()) # 多 这句话前面用了一个换行符
3.tell()能够获取读取内容的字节数
with open('a.txt', 'rb') as read_f1:
data1 = read_f1.read(12)
print(data1.decode()) # 少说点话
print(read_f1.tell()) # 12
with open('a.txt', 'r', encoding='utf8') as read_f2:
data2 = read_f2.read(4)
print(data2) # 少说点话
print(read_f2.tell()) # 12
4.seek(offset, whence)控制光标移动的字节数
offset 控制光标移动的字节数
whence 模式
0 基于文件开头移动的字节数
1 基于当前光标所在位置移动的字节数,可以是正的也可以是负的
2 基于文件末尾移动的字节数,通常是负的
PS:1和2只能在二进制模式下使用,0无论哪个模式都可以。
with open('a.txt', 'r', encoding='utf8') as read_f1:
data1 = read_f1.read()
print(data1)
read_f1.seek(0, 0)
print(read_f1.read()) # 少说点话
read_f1.seek(9, 0)
print(read_f1.read()) # 话
read_f1.seek(-6, 0)
print(read_f1.read()) # 报错
with open('a.txt', 'rb') as read_f1:
data1 = read_f1.read()
print(data1.decode()) # 少说点话
read_f1.seek(-3, 1)
print(read_f1.read().decode('utf8')) # 点
read_f1.seek(-9, 2)
print(read_f1.read().decode('utf8')) # 说点话
'''
seek(,),左边的数值表示偏移量,右边的数字表示模式,偏移量可以为正为负,但是一定要注意字节的大小。
'''
文件数据的修改
1、机械硬盘存储数据
数据的修改其实是写入的内容覆盖了原来的内容。
文件的数据储存在硬盘中,数据的删除是将占有态变成了自由态,自由态的删除可以用格式化(真的格式化设置)。可以用覆盖大量别的文件内容,然后删除,刷掉自由态的数据,保护自己的二手手机、二手电脑。
2、代码修改文件的方式
1.覆盖写
先读取文件内容到内存中,在内存中完成修改后,利用W模式打开文件将修改后的内容写入。优点在于硬盘的内存空间不变,但是数据量较大时会造成内存爆满。
'''先读取内容,将读取的内容里面的数据值替换成新的数据值,然后重新写入新的数据值'''
with open(r'a.txt', 'r', encoding='utf8') as read_f:
data1 = read_f.read()
data2 = data1.replace('努力', '闭嘴') # 少说点话 努力再努力再努力
with open(r'a.txt', 'w', encoding='utf8') as read_f2:
read_f2.write(data2) # 少说点话 闭嘴再闭嘴再闭嘴
2.重命名
先读取文件内容到内存中,在内存中完后修改后,保存到另一个文件中(新文件),再将原文件删除(快到肉眼看不到),最后将新的文件重命名为原文件的名字。优点在于不会造成内存的爆满,但是可能会占用两块内存空间(创建时),也可能在内存中创建了文件没有把数据刷到硬盘。
''''''
import os # 模块
with open('demo.txt', 'r', encoding='utf8') as read_f, \
open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f:
for line in read_f: # .swap临时文件,循环读取一行行内容
wrife_f.write(line.replace('NB', 'SB')) # 替换操作
os.remove('demo.txt') # 删除文件
os.rename('.demo.txt.swap', 'demo.txt') # 重命名文件

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?