文件处理

牧云@^-^@ 提交于 2019-12-24 11:23:14

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文本文件,默认的内容格式就是tt表示字符串(因此,内容要加引号)
  • t以字符串为单位操作文件内容,t模式下写必须是字符串
  • 只要是t模式就不要忘记字符编码;t模式必须以字符串模式读写

b格式

  • b格式:bytes二进制文件
  • bbytes为单位操作文件内容

注意:tb这两种格式均不能单独使用,都需要与r、w、a配合使用

2. 操作文件的三种基础模式

操作文件的三种基础模式:r、w、a

3. t文本文件格式+r w a模式

r模式+t格式

  • r:只读模式,默认的打开模式(只能读不能写),即默认为rt模式,t可以省略(只读的文本文件)
  • r+t模式将文件内容读出来,全部转化为字符串格式
  • 当文件不存在时,运行文件会报错
  • 当文件存在时,会将文件指针移动到开头

Alt text

  • 语法:f=open(r'a.py',mode='rt',encoding='utf-8')
  • mode指定打开模式;encoding表示告诉操作系统使用什么字符编码
  • 这一步是告诉操作系统准备好使用什么打开模式和字符编码

(1) 命令1:打开文件.read()

  • f.read()表示将这个文件内容读出来,但是仅限于小文件,如果文件太大占用大量内存资源,导致卡死

Alt text

(2) 命令2:打开文件.readline()

  • f.readline()表示一次读一行

Alt text

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

Alt text

(3) 命令3:打开文件.readlines()

  • f.readlines()将内容全读出来,并且以列表的形式呈现

Alt text

(4) 命令4:打开文件.readable()

  • f.readable()用于判断文件是否为r只读模式

Alt text

w模式+t格式

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

Alt text

(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格式

  • 使用二进制模式读取图片

Alt text

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

Alt text

  • 使用二进制模式拷贝小文件
  • 拷贝文件就是将文件的二进制读出来,再将二进制写入到指定文件,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可读可写

Alt text

a+r可读可写,追加写

r+b可读可写

Alt text

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关闭

可以同时输入多个打开文件,并且可以用\换行(让代码更清晰,提升可读性)

Alt text

Alt text

进制解码为字符串类型,更简单方法:

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:参照文件的开头,tb格式下都能用,t格式只能用0参数
  • 1:参照当前文件指针所在位置,只能在b格式下使用
  • 2:参照文件的末尾,只能在b格式下使用

  • f.seek(3,0)解释:
  • 0表示默参照物是文件的开头
  • 3表示指针向右移动3bytes(字节)的位置的指针

Alt text

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

Alt text

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

Alt text

说明:a.txt的内容为:锤子科技坚果手机

t模式下read(n)的使用

说明:只有在t模式下的read(n)n表示的是字符串个数,除此之外,但凡涉及到文件指针的操作都是以字节为单位的

Alt text

truncate(n)的使用

说明:truncate(n)截取文件,n字节,参照物固定,以文件开头为参照物,写操作,必须为读写模式,这个文件的截取是对文件的实质修改,截取的部分会被保存在文件中

with open(r'a.txt',mode='r+b') as f:
    f.truncate(6)    # 表示只截取前6个字节

2. tell统计文件指针的位置

tell统计的是指针从文件开头,到当前指针所在位置,字节的个数,即指针现在在第几个字节

Alt text

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('源文件','目标文件')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!