文件简介
1.文件的概念
计算机的读写操作都是在硬盘上完成的,用户无法通过计算机直接操作硬盘上的数据。文件就是操作系统暴露给用户操作计算机硬盘的快捷方式(相当于是中间商)
打开文件就是将数据从硬盘加载到内存
保存文件就是将数据从内存写入到硬盘
2.文件操作
文件操作就是指用python代码来控制文件自动读写
3.代码操作文件
方式1: open('文件路径','读写模式',encoding='字符编码')
f = open('a.txt','r',encoding='utf8')
f.close()
方式2 with open(文件路径,读写模式,字符编码) as 变量名
with open('a.txt','r',encoding='utf8') as f:
print(f)
4.with 语法
with支持一次打开多个文件,文件之间逗号隔开
with open(r'a.txt','r',encoding='utf8')as f1, open (r'b.txt','r',encoding='utf8')as f2
文件读写模式
1. r 只读模式(默认模式)
with open(r'a.txt','r',encoding='utf8') as f:
pass
2. w 只写模式
with open(r'a.txt','w',encoding='utf8') as f:
f1.write('hello world')
3. a 只追加模式(在原文件末尾追加新的内容)
with open(r'a.txt','a',encoding='utf8') as f:
f1.write('你好 世界')
文件操作模式
1. t模式(文本模式,默认)
r --> rt
w --> wt
a --> at
1.只能操作文本文件
2.必须指定encoding参数(字符编码)
3.读写都是以字符串为单位
2. b模式(字节模式)
rb wb ab 必须自己指定 不能省略
1.能够操作所有类型文件
2.不需要指定encoding参数
3.读写都是以字节为单位
文件内置方法
1.read() 一次性读取文件所有内容,光标停留在文件末尾
with open(r'a.txt','r',encoding='utf8') as f1:
f1_read = f1.readline()
print(f1_read)
2.readline() 一次只读一行内容
3.readlines() 按照行的方式读取所有文件内容,读取的值作为列表返回
4.readable() 判断文件是否可读
5.write() 填写文件内容
6.flush() 将内存中的文件数据立刻刷到硬盘上,类似于ctrl + s
文件拷贝练习
file_c = input('请输入您要拷贝的文件路径')
file_v = input('请输入您要拷贝到哪')
with open(fr'{file_c}','rb') as f1, open(fr'{file_v}','ab') as f2:
read_file = f1.read()
write_file = f2.write(read_file)
文件内光标的移动
1.read() 方法补充
with open(r'a.txt','r',encoding='utf8') as a:
print(a.read(4))
with open(r'a.txt','rb') as b:
print(b.read(4))
print(b.tell())
data = b.read(5)
print(data)
print(data.decode())
2.代码控制光标移动 seek(offset,whence)
f.seek(指针移动的字节数,模式选择)
模式控制:
0:默认模式,基于文件开头移动多少字节
1:基于光标当前的位置移动多少字节
2:基于文件末尾移动多少字节
with open(f'a.txt','rb') as f:
f.seek(3,0)
print(f.read())
f.seek(3,1)
f.seek(7,2)
3.练习:实现动态查看最新日志的效果
import time
with open('access.log', 'rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
time.sleep(0.5)
else:
print(line.decode('utf-8'), end='')
文件内数据的修改
代码修改文件的方式
1.覆盖写
先读取文件内容到内存 在内存中完成修改 之后w模式打开该文件写入
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:
wrife_f.write(line.replace('NB', 'SB'))
os.remove('demo.txt')
os.rename('.demo.txt.swap', 'demo.txt')
"""
优点:不会造成内存溢出
缺点:有那么一段时间需要占用硬盘两个地方的空间(可能) 也可能是在内存中创建没有刷到硬盘
"""