zoukankan      html  css  js  c++  java
  • python文件操作详解

    rw模式结合

    '''
    # w:没有文件新建文件,有文件就清空文件
    w = open('1.txt', 'w', encoding='utf-8')
    w.write('000
    ')
    # 在写入大量数据,要及时处理内存空间,不然内存可能溢出导致数据丢失
    w.flush()
    w.write('111
    ')
    # 最后一次flush()操作可以省略
    w.flush()
    # 一次性写入多行
    w.writelines(['222
    ', '333
    '])
    w.write('444')
    # w.newlines
    w.write('555')
    # 1.将内存的的数据刷新到硬盘中;2.释放文件资源
    w.close()
    
    # 需求:
    # 1.完成文本类型的文件复制:1.txt => 11.txt
    r = open('1.txt', 'r', encoding='utf-8')
    w = open('11.txt', 'w', encoding='utf-8')
    for line in r:  # 遍历就是一行一行读 取读文件的流
        w.write(line)
        w.flush()
    w.close()
    r.close()
    '''
    
    

    with open:将文件的释放交给with管理

    with open('文件', '模式', encoding='utf-8') as f:
        # 操作
        pass
    
    

    a模式:追加写入

    # temp.txt
    # 111222333
    
    with open('temp.txt', 'a', encoding='utf-8') as f:
        f.write('new msg')
        
    # 结果:111222333new msg
    
    
    

    文件的复制:就是先读再写

    # 文本类型文件的复制
    r = open('source.txt', 'r', encoding='utf-8')
    w = open('target.txt', 'w', encoding='utf-8')
    for line in r:  # 遍历就是一行一行读 取读文件的流
        w.write(line)
        w.flush()  # 将写入到内存中的数据刷新到硬盘中
    w.close()
    r.close()
    
    # 用with open语法如何处理?
    # r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写
    with open('source.txt', 'r', encoding='utf-8') as f1:
        with open('target.txt', 'a+', encoding='utf-8') as f2:
            for line in f1:
                f2.write(line)
    
    
    # 如果复制非文本类型的数据文件?
    # 从模式采用b模式,不需要关心编码问题
    with open('source.mp4', 'rb') as f1:
        with open('target.mp4', 'wb+') as f2:  # rb+ | wb | wb+ | ab | ab+
            for line in f1:
                f2.write(line)
    
    
    

    模式汇总

    *****
    
    '''
    r: 读
    w: 写(无创建,有清空)
    a: 追加(有创建的功能)
    
    t: 文本操作(默认模式)  r=>rt w=>wt a=>at
    b: 非文本文件必须采用二进制模式来处理
    +: 可读可写
    
    r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写
    rb: 二进制读 | wb:创建清空文件的二进制写 | ab: 创建不清空文件(追加)的二进制写
    rb+ | wb+ | ab+
    '''
    

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

    '''
    百度网盘 - 秒传
    '''
    '''
    1. 如何使用游标:游标的相关方法
    2. 游标相关的读写操作
    3. 根据游标在大文件中取出多个指定位置的部分字节内容
    '''
    
    '''
    seek(偏移量, 偏移位置)
    偏移位置:
    0 -- 文件开头
    1 -- 当前位置
    2 -- 文件末尾
    '''
    # 游标读
    with open('source.txt', 'rb') as f:
        d1 = f.read(11)
        print(d1)
        # print(d1.decode('utf-8'))
    
        # 当前游标的位置
        print(f.tell())
    
        # 游标操作 - 从末尾位置开始
        f.seek(-3, 2)
        d2 = f.read()
        print(d2.decode('utf-8'))  # 890
    
    # 游标写:会覆盖书写
    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))
    
    # 在大文件中,开头| 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('慢慢传去吧')
    
  • 相关阅读:
    Python学习笔记(三)
    自己出的一套前端笔试题
    Vue 数组封装和组件data定义为函数一些猜测
    前端Mvvm QC 上传了测试版
    为什么我们的web前端变的越来越复杂
    grootJsAPI文档
    grootjs 简明教程
    深入grootJs(进阶教程)
    也议 js闭包和ie内存泄露原理
    此utf8 非彼utf8 ——谈http协议里的编码问题
  • 原文地址:https://www.cnblogs.com/fuwei8086/p/10610739.html
Copyright © 2011-2022 走看看