• pytthon—day8 读写模式的结合、文件操作模式、with完成文本文件复制、游标操作


    一、读写模式的结合

    w:写指没有新建文件,有文件就清空

    w=open('1.txt','w',encoding='utf-8')
    w.write('000
    ')
    在写入数据时,需要及时处理内存空间,不然内存溢出到值数据丢失
    w.flush()
    w.write('222
    ')
    最后一次flush()刷新操作可以省略
    w.flush()
    w.close()
    1、将内存的数据刷新到硬盘中  
    2、释放文件资源

    可以一次性写多行 :指换行
    w.writelines(['1111 ','33333 '])

    需求:
    1、完成文本文件类型的文件复制:1.txt》》》11.txt
    
    r=open('1.txt','r',encoding='utf-8')
    w=open('11.txt','r',encoding='utf-8')
    for line in r:
        w.write(line)
        w.flush()
    w.close()
    r.close()
    
    
    2、将文件的关闭交给with管理,当with逻辑结束后,系统会自动释放文件
    with open('1.txt','r',encoding='utf-8') as r,open('11.txt','w',encoding='utf-8')as w:
     for line in r :
        w.write(line)
        w.flush()
    # w.close()  r.close()系统(with   open)自动运行完成,自动忽略

    二、文件操作模式

    r=读
    w=写,无创建有清空
    a=追加 有创建无清空
    t=文本操作(默认模式)》》at wt rt
    +=可读可写 r+:不会创建文件的可读可写 w+:创建文件/清空的可读可写 a+:创建文件不清空文件的可读可写
    b=非文本文件必须采用二进制的模式处理
    rb: 二进制读 | wb:创建清空文件的二进制写 | ab: 创建不清空文件(追加)的二进制写
    rb+ | wb+ | ab+
    x=创建文件,如果文件已存在就抛异常,属于写模式
    with open('1.txt','wt',encoding= 'utf-8') as f:
        f.write('666')
    借助读写,完成追加
    方法一(复杂版)
    with open('1.txt','rt',encoding= 'utf-8') as f1:
        data=f1.read()
        data+='6666'
    with open('1.txt','wt',encoding= 'utf-8') as f2:
        f2.write(data)
    方法二(简单版)
    with open('1.txt','rt',encoding= 'utf-8') as f:
        f.write('6666')
    
    
    x:写模式,创建文件,如果文件以存在,就抛异常
    with open('000.txt', 'x', encoding='utf-8') as f:
        pass
     

    三、with完成文本文件复制

    文件的复制:就是先读后写
    1、文本类型文件的复制
    先读后写
    with open('source.txt', 'r', encoding='utf-8') as f1, 
        open('target.txt', 'a', encoding='utf-8') as f2:
              ''' 
               读取一个字节,如果是行/文件等结束标识,就返回该标识,否则返回None
              '''
    print(f1.newlines) # 》》》》添加是返回值none
    
    first_data = f1.read(9)
    f2.write(first_data)
    f2.flush()  # 》》》》》读取的是第一行
    
    print(f1.newlines) # 》》》》最后一个字节是空返回空值
    
    second_data = f1.readline()
    f2.write(second_data)
    f2.flush()
    
    last_data = f1.read()
    f2.write(last_data)
    f2.flush()
    
    print(f1.newlines)
    data = f1.read()
    print(data)
    
    
    2、用with open语法如何处理?
    边读边写
    with open('source.txt', 'r', encoding='utf-8') as f1:
        with open('target.txt', 'r', encoding='utf-8') as f2:
            for line in f1:
                f2.write(line)
    
    
    

    3、如果复制非文本类型的数据文件?
    with open('333.mp4', 'rb') as f1:
        with open('666.mp4', 'wb+') as f2:
            for line in f1:
                f2.write(line)
    
    

    四、游标操作

    游标:必须在b模式下操作,seek中偏移的是字节

    如  百度网盘——秒传
    1、如何使用游标,游标的相关方法
    方法:seek
    偏移量:移动的字节数,负数是结合1,2位置往前偏移
    偏移位置:0:代表游标移至文件/数据的开头
                    1代表:当前游标的位置开始偏移
                    2:代表:从文件末尾开始偏移

    2、游标相关的读写操作
    b'你好1234567890'
    # 游标读
    with open('source.txt','rt',encoding='utf-8')as f:
        d1=f.read()
        print(d1)
        f.seek(0,0) # 游标操作——从头开始
        d2=f.read()
        print(d2)
    
    # 游标读
    with open('source.txt', 'rb') as f:
        d1 = f.read()
        print(d1)
        # print(d1.decode('utf-8'))#  》》》解码的过程,不加则输出为二进制的数据
    
        当前游标的位置
        print(f.tell())
    
        游标操作 - 从末尾位置开始
        f.seek(-3, 2)
        d2 = f.read()
        print(d2.decode('utf-8'))  # 890
    
        游标操作 - 从当前位置开始
        f.seek(-3, 1)
        d2 = f.read()
        print(d2.decode('utf-8'))  # 34567890
    
        游标操作 - 从头开始
        f.seek(3, 0)
        d2 = f.read()
        print(d2)
        print(d2.decode('utf-8'))  # 好1234567890
    
    
    游标写:会覆盖书写
    with open('source.txt', 'rb+') as f:
        f.seek(11)
        # print(f.read())
        f.write(b'000')
    
    
    案例
    with open('001.png', 'rb') as f:
        data = f.read()
    print(len(data))

    3、根据游标在大文件中取出多个指定位置的部分字节内容
    在大文件中,开头| 1/3 | 2/3 | 末尾 各取10个字节拼接成秒传的信息依据
    形成秒传规则
    tagData = b''
    with open('001.png', 'rb') as f:
        通过其他途径(sys模块)来获取文件总大小
        data = f.read()
        length = len(data)
        开头
        f.seek(0, 0)
        d1 = f.read(10)
        # 1/3
        f.seek(length // 3, 0)
        d2 = f.read(10)
        # 2/3
        f.seek(length // 3 * 2, 0)
        d3 = f.read(10)
        末尾
        f.seek(-10, 2)
        d4 = f.read(10)
        tagData = d1 + d2 + d3 + d4
    秒传依据
    print(tagData)
    newData = b""
    with open('001.png', 'rb') as f:
        data = f.read()
        length = len(data)
        f.seek(0, 0)
        newData += f.read(10)
        f.seek(length // 3, 0)
        newData += f.read(10)
        f.seek(length // 3 * 2, 0)
        newData += f.read(10)
        f.seek(-10, 2)
        newData += f.read(10)
    
    if newData == tagData:
        print('秒传成功')
    else:
        print('慢慢传去吧')


  • 相关阅读:
    gulp管理静态资源缓存
    你懂AI吗(1)
    Vue.js之render函数基础
    笑看女程序员征婚SQL,半夜巡逻民警突然对我大喊int类型占几个字节
    高吞吐量的分布式发布订阅消息系统Kafka之Producer源码分析
    Java并没有衰落.大家对它的认识才刚刚开始 Java8全新出发
    那些面试官必问的JAVA多线程和并发面试题及回答
    在阿里一位新员工是怎么一步步培养起来的
    Lambda表达式用法大比较: Scala和Java 8
    国内外程序员编程网站、博客,对学编程的你提供一点小小的帮助
  • 原文地址:https://www.cnblogs.com/zhouqinmei/p/10615415.html
Copyright © 2020-2023  润新知