Python-09
@(Python)
文件处理
一、什么是文件
- 文件是操作系统为用户或应用程序,提供的一个读写硬盘的虚拟单位,文件可以是文本文件、视频、音频、图片等形式
- 对文件的读写操作,其实就是对操作系统发起请求,然后由操作系统控制硬盘来读写
二、 为什么要有文件
- 计算机和人,有永久保存和使用数据的需求,文件可以永久保存在磁盘中,并且可被临时存储到内存
三、文件的基本操作
1. 打开文件
- 打开文件的语法:
open(r'文件路径')r(rawstring ):原生字符串,表示后面出现的都是原生字符,没有其他特殊意义,也可以使用\单个转义f=open(r'文件路径'),将open(r'文件路径')赋值,此时是占用了应用程序的资源
2. 操作文件(读或写)
data=f.read()表示向操作系统发起打开文件请求,要求打开文件(文件操作会占用操作系统和应用程序的资源)- 读写的操作会被操作系统转成具体的硬盘操作,将文件由硬盘读入内存
3. 关闭文件
f.close()表示关闭文件,回收占用操作系统的资源,关闭的是f的值在操作系统的资源,本身的值还在应用程序的内存中- 不要使用del删除变量的绑定关系,虽然能删除绑定关系,但是这个打开的文件,还会占用操作系统的资源,需要等待一定时间才能被回收,如果这样的文件过多,就会导致占用大量的资源
4. 总结
- 文件的基本操作就是,打开文件---操作文件---关闭文件,这三个步骤
f=open(r'a.py') # 打开文件 data=f.read() # 操作文件 print(data) f.close() # 关闭文件
四、文件的打开格式和模式
1. 读写文件内容有两种格式:
① t格式
t格式:text文本文件,默认的内容格式就是t,t表示字符串(因此,内容要加引号)t以字符串为单位操作文件内容,t模式下写必须是字符串- 只要是
t模式就不要忘记字符编码;t模式必须以字符串模式读写
② b格式
b格式:bytes二进制文件b以bytes为单位操作文件内容
注意:
t和b这两种格式均不能单独使用,都需要与r、w、a配合使用
2. 操作文件的三种基础模式
操作文件的三种基础模式:
r、w、a
3. t文本文件格式+r w a模式
① r模式+t格式
r:只读模式,默认的打开模式(只能读不能写),即默认为rt模式,t可以省略(只读的文本文件)r+t模式将文件内容读出来,全部转化为字符串格式- 当文件不存在时,运行文件会报错
- 当文件存在时,会将文件指针移动到开头

- 语法:
f=open(r'a.py',mode='rt',encoding='utf-8')mode指定打开模式;encoding表示告诉操作系统使用什么字符编码- 这一步是告诉操作系统准备好使用什么打开模式和字符编码
(1) 命令1:
打开文件.read()
f.read()表示将这个文件内容读出来,但是仅限于小文件,如果文件太大占用大量内存资源,导致卡死

(2) 命令2:
打开文件.readline()
f.readline()表示一次读一行

说明:
end=''表示不换行???

(3) 命令3:
打开文件.readlines()
f.readlines()将内容全读出来,并且以列表的形式呈现

(4) 命令4:
打开文件.readable()
f.readable()用于判断文件是否为r只读模式

② w模式+t格式
w:只写模式,即只能写,不能读- 当文件不存在时,会创建一个空文件,并写入内容
- 当文件存在时,会清空文件内容,再写入内容
- 语法:
f=open(r'a.txt',mode='wt',encoding='utf-8')- 只有文本文件,才有字符编码的概念,
b二进制格式下不写encoding字符编码

(1) 命令1:
打开的文件.write(要写的字符串内容)
- 一次一行写入内容,
\n表示换行
f=open(r'a.py',mode='wt',encoding='utf-8')
f.write('第一行\n')
f.write('第二行\n')
f.close()
(2) 命令2:
打开的文件.writelines(['a','b\n','c'])
- 一次写入多行内容,相当于使用
for循环调用write
f=open(r'a.py',mode='wt',encoding='utf-8') f.writelines(['第一行\n','222\n','333\n','4444\n']) f.close()
③ a模式+t格式
a只追加写模式,即只能写,不能读,不同于w的是,a为追加- 当文件不存在时,会创建一个空文件
- 当文件存在时,会将指针移动到文件末尾,追加写入内容
a模式一般用于写日志,追加文件
f=open(r'a.py',mode='at',encoding='utf-8') f.writelines(['111\n','222\n','333\n']) f.close()
3. b二进制格式+r w a模式
b是通用模式,所有文件都是二进制文件,读什么文件都可以,读出的都是二进制b模式必须以二进制模式读写,不能指定字符编码
① r模式+b格式
- 使用二进制模式读取图片

p=open(r'p.jpg',mode='rb')
for line in p:
print(line)
p.close() # 关闭文件

- 使用二进制模式拷贝小文件
- 拷贝文件就是将文件的二进制读出来,再将二进制写入到指定文件,
f.read适合小文件
# 使用二进制读取图片的二进制
f=open('p.jpg',mode='rb')
data=f.read()
f.close()
# 将图片的二进制写入目录下
p=open(r'K:\tu.jpg',mode='bw')
p.write(data)
f.close()
- 使用二进制模式拷贝大文件,就不适合用
read了- 循环读:大文件就需要
for循环读,同一时间,在内存中只有一行,不占用过多内存空间
read_vedio=open(r'01 操作系统.mp4',mode='rb') # 准备读出二进制(打开文件)
write_vedio=open(r'K:\vedio.mp4',mode='ab') # 准备写入二进制(打开文件)
for line in read_vedio: # 使用for将读出的二进制,一行一行的写入line(操作文件)
write_vedio.write(line)
read_vedio.close() # 关闭文件
write_vedio.close() # 关闭文件
② w模式+b格式
将字符串要编译成二进制,才能写
f=open(r'a.py',mode='wb')
f.write('写入二进制'.encode('utf-8'))
f.close()
③ a模式+b格式
f=open(r'a.py',mode='ab')
f.write('11111,222222'.encode('utf-8'))
f.close()
4. +模式
① r+t可读可写
② w+t可读可写

③ a+r可读可写,追加写
④ r+b可读可写

⑤ w+b可读可写
⑥ a+b可读可写,追加写
五、上下文管理
with用来管理close,适合需要打开多个文件时
- 当打开的文件过多时,打开文件 可以使用
\进行换行
with open(r'a.py',mode='rt',encoding='utf-8') as f: 相当于: f=open(r'a.py',mode='rt',encoding='utf-8')
with open(r'a.py',mode='rt',encoding='utf-8') as f:
data=f.read.() # 书写具体操作
# 不用再考虑输入f.close(),with会自动调用close关闭
可以同时输入多个打开文件,并且可以用
\换行(让代码更清晰,提升可读性)


进制解码为字符串类型,更简单方法:
with open(r'a.py',mode='rb') as f,open(r'a.txt',mode='wb') as p:
data=f.read()
p.write(data)
六、文件指针
1. seek文件指针的移动
- 语法格式:
f.seek(offset,whence)f.seek(指针移动几个字节,参照物(0 1 2))offset表示文件指针的偏移量,移动指针以bytes(字节)为单位whence表示参照物,有三个参数0:参照文件的开头,t和b格式下都能用,t格式只能用0参数1:参照当前文件指针所在位置,只能在b格式下使用2:参照文件的末尾,只能在b格式下使用
f.seek(3,0)解释:0表示默参照物是文件的开头3表示指针向右移动3bytes(字节)的位置的指针

f.seek(-3,2)解释:2表示参照文件末尾-3表示指针倒着移动(向左移动)
f.seek(0,2):表示快速移动到文件末尾2模式应该使用负数,用正数没有意义

说明:
f.seek(3,0)的3表示3个bytes,一个中文字符在utf-8中占3bytes,如果移动指针小于3bytes就会报错

说明:
a.txt的内容为:锤子科技坚果手机
① t模式下read(n)的使用
说明:只有在
t模式下的read(n)的n表示的是字符串个数,除此之外,但凡涉及到文件指针的操作都是以字节为单位的

② truncate(n)的使用
说明:
truncate(n)截取文件,n字节,参照物固定,以文件开头为参照物,写操作,必须为读写模式,这个文件的截取是对文件的实质修改,截取的部分会被保存在文件中
with open(r'a.txt',mode='r+b') as f:
f.truncate(6) # 表示只截取前6个字节
2. tell统计文件指针的位置
tell统计的是指针从文件开头,到当前指针所在位置,字节的个数,即指针现在在第几个字节

with open(r'a.txt',mode='rb') as f:
f.readline() # 读出一行,指针移动到最后
print(f.tell()) # 统计从开头到当前指针位置的bytes
f.seek(6,1)
print(f.readline().decode('utf-8'))
print(f.tell())
3. 文件内容的修改
- 在磁盘上没有修改,只有覆盖
- 文件在磁盘上都是用新内容覆盖旧内容,没有修改这一说 但是内存中的数据可以修改,因此,可以在内存中修改后,再覆盖到磁盘
① 修改文件内容的方式一
- 先将原文件内容一次性全部读到内存,然后修改完毕后,再覆盖写回原文件
- 优点:在修改期间,文件内容只有一份
- 缺点:当文件过大时,会占用过多的内存
# 读出文件,并且替换
with open(r'a.txt',mode='rt',encoding='utf-8') as f:
file01=f.read()
file02=file01.replace('锤子','Smartian')
# 写入文件覆盖
with open(r'a.txt',mode='wt',encoding='utf-8') as f1:
f1.write(file02)
② 修改文件内容的方式二:
- 以读的方式打开原文件,以写的方法打开新文件
- 从原文件中循环读取每一行内容,修改后写入新文件
- 先删除原文件,再将新文件重新命名为原文件的名字
- 优点:同一时刻只有一行内容存在内存中
- 缺点:在修改期间,文件内容始终存在两份,但修改完毕后会只留一份
import os # os是一个功能的集合体
with open(r'a.txt',mode='rt',encoding='utf-8') as f,\
open(r'a.txt.swap',mode='wt',encoding='utf-8') as f1: # 新文件
for line in f:
file=line.replace('锤子','Smartian')
f1.write(file)
os.remove('a.txt') # 删除老文件
os.rename('a.txt.swap','a.txt') # 将新文件重命名为旧文件名
os.remove('路径')
os.rename('源文件','目标文件')
来源:https://www.cnblogs.com/itone/p/9443606.html