zoukankan      html  css  js  c++  java
  • 文件操作模式

    一、文件操作

    1、wr模式结合

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

    2、文件操作模式

    ①主模式:

    r 读           r+:不会创建文件的可读可写
    w 写           w+:创建清空文件的可读可写
    a 追加         a+:创建不清空文件的可读可写

    ②从模式:

    t 文本操作(默认模式),要规定文本的编码格式utf-8
    b 飞文本文件必须采用二进制模式处理,不需要规定文本的编码格式。
    + 可读可写
    x 写,必须有自己的文件,否则会报错

    ③a为写模式,在原数据后追加写入新数据(追加写入)

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

     

    3、文件的复制:就是先读后写

    ①文本类型文件的复制

    rw模式:
    
    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 open 将文件的释放交给with管理,当with中逻辑结束后,系统自动释放文件)

    with open('souurce.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模式,不需要关心编码问题

    案例:复制source.mp4为target.mp4
    
    with open('source.mp4', 'rb') as f1:
             with open('target.mp4', 'wb') as f2:
                    for line in f1:
                         f2.write(line)

    二、游标操作

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

    1、游标方法:seek(偏移量,偏移位置)

    偏移量:移动的字节数
    
    偏移位置:
        1——从当前游标位置开始偏移
        0——从文件开始位置开始偏移
        2——从文件末尾开始偏移

    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
        # 游标操作 - 从当前位置开始
        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')

    3、案例

    # 案例
    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('慢慢传去吧')
     
  • 相关阅读:
    linux创建用户
    使用Myeclipse插件将wsdl生成java客户端代码
    JAVA时间格式转换大全
    数据库DDL语句书写规范
    jacon
    应用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space)
    为什么使用内部类
    HBase查找一条数据的过程
    Hadoop:输入,输出,key,value格式
    ArrayList和Vector的区别
  • 原文地址:https://www.cnblogs.com/zhangguosheng1121/p/10615455.html
Copyright © 2011-2022 走看看