一. 文件操作介绍
1. 文件:
操作系统暴露给用户可以直接操作硬盘的快捷方式
2. 代码操作文件的流程:
2.1 打开文件、创建文件
2.2 编辑文件内容
2.3 保存文件内容
2.4 关闭文件
with open(r'a.txt', 'r', encoding='utf8') as f: # f = open()
二. 文件操作模式
t模式
文本模式 是默认的模式
r rt
w wt
a at
1.该模式只能操作文本文件
2.该模式必须要指定encoding参数
3.该模式读写都是以字符串为最小单位
b模式
二进制模式 可以操作任意类型的文件
rb 不能省略b
wb 不能省略b
ab 不能省略b
1.该模式可以操作任意类型的文件
2.该模式不需要指定encoding参数
3.该模式读写都是以bytes类型为最小单位
三. 文件读写模式
r read 只读模式:只能读不能写
w write 只写模式:只能写不能读
a append 只追加模式:在文件末尾添加内容
'''-------------------------------------一. r模式---------------------------------------------'''
# 路径不存在:直接报错
with open(r'b.txt', 'r', encoding='utf8') as f1:
# 路径存在:正常打开文件并等待内容读取
with open(r'a.txt', 'r', encoding='utf8') as f1:
print(f1.read()) # 一次性读取文件内所有的内容
f1.write('python是最牛逼的语言!!!') # 报错
"""
able在英语中大部分情况下表示的是 具备...的能力
readable 具备读的能力
writable 具备写的能力
...
"""
'''-------------------------------------二. w模式---------------------------------------------'''
# 路径不存在:自动创建文件
with open(r'b.txt', 'w', encoding='utf8') as f1:
# 路径存在:先清空文件内容 之后再写入数据
with open(r'a.txt', 'w', encoding='utf8') as f1:
f1.write('你们是我见过的最优秀一批学生1\n') # 写入文件内容
f1.write('你们是我见过的最优秀一批学生2\r') # 写入文件内容
f1.write('你们是我见过的最优秀一批学生3\n') # 写入文件内容
print(f1.read())
"""
换行 最早的时候:\r\n
为了节省空间支持一个字符 根据操作系统的不同可能有所区别
\n 、 \r
"""
'''-------------------------------------三. a模式---------------------------------------------'''
# 路径不存在:自动创建文件
with open(r'c.txt', 'a', encoding='utf8') as f1:
# 路径存在:不会清空文件内容 而是在文件末尾等待新内容的添加
with open(r'a.txt', 'a', encoding='utf8') as f1:
f1.write('哈哈哈哈或或或或或')
print(f1.read())
四. 文件内置方法
1. 一次性读取文件内容
read()
1.1 执行完之后光标在文件末尾 继续读取没有内容
1.2 当文件内容特别大的时候 容易造成内存溢出(满了)
# read在文本模式下 括号内的数字表示的是读取指定的字符个数
with open(r'a.txt','r',encoding='utf8') as f:
print(f.read(3))
print(f.read(3))
# read在二进制模式下 括号内的数字表示的是读取指定的字节数
with open(r'a.txt', 'rb') as f:
print(f.read(9).decode('utf8'))
print(f.read(1).decode('utf8'))
2. 一次只读一行内容
readline()
3.结果是一个列表 里面的各个元素是文件的一行行内容
readlines()
4. 判断当前文件是否可读
readable()
支持for循环 # 一行行读取文件内容(推荐使用) 内存中同一时刻只会有一行内容
5. 写入文件内容(字符串或者bytes类型)
write()
6. 可以将列表中多个元素写入文件
writelines()
7. 判断文件是否可写
writable()
8. 相当于主动按了ctrl+s(保存)
flush()
9. 获取光标距离文件开头的字节数
tell()
五. 文件内光标的移动(了解)
1. 前戏
with open(r'a.txt','r',encoding='utf8') as f:
print(f.read(3))
print(f.read(3))
# read在文本模式下 括号内的数字表示的是读取指定的字符个数
with open(r'a.txt', 'rb') as f:
print(f.read(9).decode('utf8'))
print(f.read(1).decode('utf8'))
# read在二进制模式下 括号内的数字表示的是读取指定的字节数
# unicode所有的字符都是用2bytes来起步表示
# utf8中文用3bytes来表示 英文用1bytes来表示 往后unicode可以不做研究 只研究utf8、gbk等编码即可
2. 控制光标的移动
with open(r'a.txt','r',encoding='utf8') as f:
print(f.read())
f.seek(3,1)
print(f.read())
with open(r'a.txt', 'rb') as f:
print(f.read(3).decode('utf8'))
f.seek(3, 1) # 基于当前位置 继续往后移动三个字节
f.seek(-3, 2) # 基于文件末尾 往前移动三个字节
print(f.tell()) # 获取光标基于文件开头的字节数
print(f.read().decode('utf8'))
"""
seek方法可以控制光标的移动 在文本模式下移动的单位也是字节数
seek(offset,whence)
offset:控制移动的字节数
whence:控制模式
0:相对于文件开头(让光标先移动到文件开头)
支持文本模式和二进制模式
1:相对于当前位置(让光标先停留在当前位置)
只支持二进制模式
2:相对于文件结尾(让光标先移动到文件末尾)
只支持二进制模式
"""
# 实时检测文件内是否有新增的内容并打印出来(没有太多的实际意义)
with open('access.log', mode='rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
# 没有内容
pass
else:
print(line.decode('utf-8'), end='')