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