• day12 文件操作(下)


    一、x模式(控制文件操作模式,与rwa同级)

    1 特点

    创建不存在文件,文件存在则报错

    可写不可读

    2 格式

    with open('d.txt',mode='x',encoding='utf-8') as f:
        f.write('哈哈哈
    ')
    #d文件存在则报错,不存在则创建并写入哈哈哈
    

    二、b模式(控制文件读写内容的模式,与t同级)

    1.b模式和t模式的区别

    t模式:

    1. 读写都必须是以字符串(uncode)为单位
    2. 只能针对文本文件
    3. 必须指定字符编码,即必须指定encoding参数
    4. 硬盘的二进制读入内存-》t模式会直接把内存中的二进制encode解码

    b模式(binary):

    1. 读写都是以bytes为单位
    2. 可以针对所有文件
    3. 一定不能指定字符编码,即一定不能指定encoding参数
    4. 硬盘中的二进制读入内存-》b模式下不会做任何操作,直接读入内存

    总结:在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码和解码,所以t在纯文本的操作上更方便。非纯文本文件只能用b模式

    2 b模式应用

    with open("a.txt","rb") as f :
        print(f.read().decode("utf-8"))
    #在b模式下如果想读文本文件,必须要以源文件存的方式解码,如果没有这一步操作输出的是一个bytes类型
    
    #同理,在写文件的时候,就要以文件同样格式去编码
    
    with open(r"cvc.txt","wb") as f :
        f.write("aaaa".encode("utf-8"))
    

    3 循环读取文件

    方式一:自己控制每次读取的数据的数据量(while)

    with open(r"cvc.txt","rb") as f :
        while True:
            res = f.read(5)#控制每次只读5个字节的数据
            print(res)
            if len(res) == 0:
                break
    

    方式二:每次读一行(for)

    with open(r"cvc.txt","rb") as f :
        for line in f:
            print(line)
    

    三、文件操作的其他方法

    1 读相关操作

    1.1readline:一次读一行

    with open(r"cvc.txt","rt",encoding="utf-8") as f :
        res = f.readline()
        print(res)
    

    1.2readlines:把文件内容存放到列表内,以换行符分隔

    with open(r"cvc.txt","rt",encoding="utf-8") as f :
        res = f.readlines()
        print(res)
    >>>['aaaa
    ', '12321
    ', '123123
    ', '123123
    ', '12321
    ', '213312
    ', '123
    ', '123']
    

    强调:read和readlines都是将文件所有的内容读到内存中,如果文件过大,容易内存溢出

    2 写相关操作

    2.1writelines:readlines的反操作,把列表中的数据写到文件中

    with open(r"cvc.txt","wt",encoding="utf-8") as f :
        f.writelines(["aaa","BBB"])#不能写数字
    

    补充1:b模式下,如果是纯英文和数字可以在前面加b前缀得到bytes类型

        l = [
            b'1111aaa1
    ',
            b'222bb2',
            b'33eee33'
        ]
            l = [
            '1111aaa1
    '.encode('utf-8'),
            '222bb2'.encode('utf-8'),
            '33eee33'.encode('utf-8')
        ]
        #这两者效果相同
    

    补充2:'上'.encode('utf-8') 等同于bytes('上',encoding='utf-8')

    3 flsh刷新

    with open('h.txt', mode='wt',encoding='utf-8') as f:
        f.write('哈')
        f.flush()
    #操作系统在把应用程序的数据写入文件时不是瞬时的,需要攒到一定量再执行,flush可以忽略这个设定直接执行。
    

    4 了解

    with open('h.txt', mode='wt',encoding='utf-8') as f:
        print(f.readable())#判断文件是否可读
        print(f.writable())#判断文件是否可写
        print(f.encoding)#读取文件存放的字符编码
        print(f.name)#读取文件名称
    print(f.closed)#判断文件是否关闭
    >>>False
    >>>True
    >>>utf-8
    >>>h.txt
    >>>True
    

    四、文件高级操作:控制文件指针的移动

    前提:文件指针移动的单位是bytes

    只有一种情况下特殊,t模式我们读取文件时,获得的是字符串,所以这个时候指针移动的单位是字符

    with open('aaa.txt',mode='rt',encoding='utf-8') as f:
        res=f.read(4)
        print(res)
    

    f.seek(n,模式)n代表的是移动的字节数

    1 模式0:参照物是文件开头

    with open(r"cvc.txt","rb") as f :
        f.seek(5,0)#从开头把光标移动到底5个字节处
        f.seek(111,0)#从开头把光标移动到第111字节处,如果没有这么多,就移到最后一个
    

    2 模式1:参照物是光标当前所在位置

    with open(r"cvc.txt","rb") as f :
        f.seek(3,1)#在第三个字节处
        f.seek(1,1)#在第四个字节处
    

    3 模式2:参照物是文件末尾,应该是倒着移动的n为负数

    with open(r"cvc.txt","rb") as f :
        f.seek(-1,2)#在文件倒数第一个字节处
        f.seek(-2,2)#在文件倒数第二个字节处
    

    强调 0模式可以在t模式下使用,1,2模式只能在b模式下使用

    4 tell获取文件当前光标所在位置

    with open(r"cvc.txt","rb") as f :
        f.seek(-1,2)
        f.seek(-2,2)
        res = f.tell()
        print(res)
    >>>3
    

    五、文件修改

    强调

    1. 硬盘空间是无法修改的,硬盘中的数据的更新都是用新的值取覆盖旧的值
    2. 内存中的数据是可以修改的
    # 文件a.txt内容如下
    张一蛋     山东    179    49    12344234523
    李二蛋     河北    163    57    13913453521
    王全蛋     山西    153    62    18651433422
    
    # 执行操作
    with open('a.txt',mode='r+t',encoding='utf-8') as f:
        f.seek(9)
        f.write('<妇女主任>')
    
    # 文件修改后的内容如下
    张一蛋<妇女主任> 179    49    12344234523
    李二蛋     河北    163    57    13913453521
    王全蛋     山西    153    62    18651433422
    

    因此如果需要修改文件,只能把文件的数据从硬盘读到内存中,然后在内存中修改最后覆盖源文件

    方式一

    #实现思路:讲文件的内容一次性全部读入内存中,然后再内存中修改,最后覆盖原文件
    #优点:在文件修改的过程中只有一个文件
    #缺点:一次性读入内存会过多占用内存空间
    with open("b.txt","r",encoding="utf-8") as f :
        info = f.read()
    with open("b.txt","w",encoding="utf-8") as f1:
        f1.write(info.replace("a","b"))
    

    方式二

    #实现思路:打开原文件的同时,创建一个临时文件,把原文件的数据一行一行的读入内存,再保存到临时文件,最后把原文件删除,重命名临时文件
    #优点:不会占用很多内存空间,同时出现在内存中的数据只有一行
    #缺点:文件修改的过程中会出现两个文件
    import os
    with open("b.txt","r",encoding="utf-8") as f1,
            open(".b.txt.swap","w",encoding="utf-8") as f2:
        for line in f1:
            f2.write(line.replace("b","a"))
    os.remove("b.txt")
    os.rename(".b.txt.swap","b.txt")
    
    
  • 相关阅读:
    JS Map的使用
    C# 创建Windows服务
    Oracle 表空间不足解决办法
    C# 企业微信API开发(获取Token,给用户发送消息)
    企业微信API开发笔记
    css实现div不定宽高垂直水平居中解决方案
    前端面试题目大全(附答案)
    移动Web开发
    jquery 给iframe里的元素添加事件
    Jquery实现可拖动进度条demo
  • 原文地址:https://www.cnblogs.com/hz2lxt/p/12503636.html
Copyright © 2020-2023  润新知