zoukankan      html  css  js  c++  java
  • 文件处理

    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(要写的字符串内容)

    • 一次一行写入内容, 表示换行
    f=open(r'a.py',mode='wt',encoding='utf-8')
    f.write('第一行
    ')
    f.write('第二行
    ')
    f.close()
    

    (2) 命令2:打开的文件.writelines(['a','b ','c'])

    • 一次写入多行内容,相当于使用for循环调用write
    f=open(r'a.py',mode='wt',encoding='utf-8')
    f.writelines(['第一行
    ','222
    ','333
    ','4444
    '])
    f.close()
    

    a模式+t格式

    • a只追加写模式,即只能写,不能读,不同于w的是,a为追加
    • 当文件不存在时,会创建一个空文件
    • 当文件存在时,会将指针移动到文件末尾,追加写入内容
    • a模式一般用于写日志,追加文件
    f=open(r'a.py',mode='at',encoding='utf-8')
    f.writelines(['111
    ','222
    ','333
    '])
    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:	u.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('源文件','目标文件')
  • 相关阅读:
    Linux脚本中使用特定JDK
    redis 模糊匹配批量清理 keys
    git push 本地项目推送到远程分支
    extentreports报告插件之extentX之服务搭建(三)
    extentreports报告插件与testng集成(二)
    extentreports报告插件与testng集成(一)
    初识ios自动化(一)
    css 选择器
    appium移动端测试之滑动(二)
    使用appium进行ios测试,启动inspector时遇到的问题(一)
  • 原文地址:https://www.cnblogs.com/itone/p/9443606.html
Copyright © 2011-2022 走看看