zoukankan      html  css  js  c++  java
  • 文件操作的其他模式补充

    一、r+模式

    # with open(r'a.txt',mode='r+',encoding='utf-8') as f:
    #     print(f.readable())  # True
    #     print(f.writable())  # True
    #     print(f.readline())  # 会将”a.txt“文件中的第一行内容打印出来
    #     f.write('我')  # 会将”我“这个字添加到'a.txt'文件中内容中最后一个光标后面
    
    
    # with open(r'a.txt',mode = 'r+b') as f:
    #     print(f.readable())
    #     print(f.writable())
    #
    #     print(f.read())  # 打印出来的内容为’a.txt‘文件内容的字节符号
    
    
        # res = f.read()
        # print(res.decode('utf-8'))  # 将’a.txt‘的内容打印出来
    View Code

    二、w+模式

    # with open(r'a.txt',mode = 'w+',encoding = 'utf-8') as f:
    #     print(f.readable())  # True
    #     print(f.writable())  # True
    #     f.write('活在梦里')  # 会将该内容写入'a.txt'文件中,并且替换掉源文件的内容
    View Code

    三、a+模式

    # with open(r'a.txt',mode = 'a+',encoding = 'utf-8') as f:
    #     print(f.readable())  # True
    #     print(f.writable())  # True
    #     f.write('最好的我们')  # 默认将该内容添加到'a.txt'文件的末尾
    View Code

    四、文件光标的移动

    注意:
    #在rt模式下,read内的数字表示的是字符的个数
    #除此之外,数字表示的是字节

    """
    f.seek(offset,whence)
    offset:相对偏移量: 光标移动的位数
    whence:
    0:参照文件的开头 t和b都可以使用
    1:参照光标所在的当前位置 只能在b模式下用
    2:参照文件的末尾 只能在b模式下使用
    """
    #0:参照文件开头
    # with open(r"a.txt",mode = 'rt',encoding = 'utf-8')as f:
    #     print(f.read(2))
    #     f.seek(10,0)  # seek移动的是字节的个数
    #     print(f.read(3))
    
        # f.seek(0,0)  # 表示光标不移动
        # print(f.read(9))  # 打印的是字符的个数
    
    
    # with open(r'a.txt',mode = 'rb') as f:
    #     print(f.read(3))  # 打印的为第一个中文的3个字节
    #
    #
    #     f.seek(6,0)
    #     res = f.read(3)
    #     print(res)  # 打印出的为6个字节之后的3个字节
    #     print(res.decode('utf-8'))  # 同上,只是转换成了字符
    
    

    #1:参照光标所在的位置 # with open(r'a.txt',mode = 'rb') as f: # print(f.read(3).decode('utf-8')) # f.seek(7,1) # seek移动的是字节的个数 # print(f.read(1))


    #2:参照文件的末尾 # with open(r'a.txt',mode = 'rb')as f: # print(f.read()) # f.seek(-3,2) # print(f.read().decode('utf-8')) # 打印出来的为末尾的三个字节符号

     

    五、检测文件内容

    with open(r'a.txt','rb') as f:
        # 先将光标移动到文件末尾
        f.seek(0,2)
        while True:
            res = f.readline()
            # 查看光标移动了多少位 bytes
            # print(f.tell())
            if res:
                print("新增的文件内容:%s"%res.decode('utf-8'))
                # 说明有人操作当前文件
            # else:
            #     # 说明文件没有被任何人操作
            #     print('暂无其他人操作该文件')

    六、截断文件内容

    with open(r'a.txt','a',encoding = 'utf-8') as f:
        f.truncate(3)  # 接收字节的长度,必须为整型
        #保留0~3的字节数,后面的全部删除

    七、修改文件的两种方式

    第一种方式:

    # 先将数据由硬盘读到内存(读文件)
    # 在内存中完成修改(字符串的替换)
    # 再覆盖原来的内容(写文件)

    with open(r'a.txt','r',encoding='utf-8') as f:
        data = f.read()
        print(data)  # 读取该文件
    
    with open(r'a.txt','w',encoding='utf-8') as f:
        res = data.replace('egon','jason')  # 将该文件里指定的内容进行替换
        f.write(res)  # 将修改的内容写入

    优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
    缺点:当文件过大的情况下,可能会造成内存溢出

    第二种方式:

    # 创建一个新文件
    # 循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中
    # 将老文件删除 将新文件的名字改成老文件名

    import os  # 调用功能
    
    
    with open(r'test02.txt','r',encoding='utf-8') as read_f,
            open(r'test02.swap','a',encoding='utf-8') as write_f:
        for line in read_f:  # 取read_f 中的文件
            new_line = line.replace('jason','egon')
            write_f.write(new_line)
    os.remove('testt02.txt')  # 移除该文件
    os.rename('test02.swap','test02.txt')  # 重新命名

    优点:内存中始终只有一行内容 不占内存

    缺点:再某一时刻硬盘上会同时存在两个文件

  • 相关阅读:
    matlab基础知识
    reverse number
    C++基础知识(一)
    ES6 let const学习
    [ZZ]一名IT从业者的英语口语能力成长路径
    使用windows Live Writer 以及office word 2013发布文章到博客园总结
    CString.format的用法
    Cstring 与 string 注意点
    卡尔曼滤波应用
    linux 重新挂载分区(教程)
  • 原文地址:https://www.cnblogs.com/xiongying4/p/11152996.html
Copyright © 2011-2022 走看看