zoukankan      html  css  js  c++  java
  • 2019-07-08 文件操作的补充

    一、其他模式补充

      之前学的r(只能读)/w(只能写)/a(只能写)

      今天学的:

      r+/w+/a+(都变成读写模式)

    with open(r'test',mode='r+',encoding='utf-8') as f:
        print(f.readable())
        print(f.writable())
        print(f.readline())
        f.write('嘿嘿嘿')
    
    
    
    with open(r'test',mode='w+',encoding='utf-8') as f:
        print(f.readable())
        print(f.writable())
        print(f.readline())
        f.write('嘿嘿嘿')
    
    
    with open(r'test',mode='a+b') as f:
        print(f.readable())
        print(f.writable())

    二、文件内光标移动 

      test文件

    f.seek(offset,whence)
    offset:相对偏移量 光标移动的位数
    whence:
    0:参照文件的开头 t和b都可以使用
    1:参照光标所在的当前位置 只能在b模式下用
    2:参照文件的末尾 只能在b模式下使用

      注意:在rt模式下,read内的数字  表示的是字符的个数(read(5) 表示读取五个字符)除此之外,数字表示的都是字节

         rb模式下,read内的数字表示的是字节数(注意:而且三个字节表示一个汉字,一个字节表示一个英文,如果在读汉字的时候,一定要是3的倍数,在转成汉字的时候才不会报错。

      seek参数为0的时候:(光标在文件的开头)

    with open(r'test','rt',encoding='utf-8') as f:
        print(f.read(1))   #rt模式数字1代表一个字符    #我
        f.seek(6,0)  # seek移动都是字节数,0代表把光标移动到开头,6代表移动6个字节
        print(f.read(1))  #读取一个字符     #让
    
    
    with open(r'test','rb') as f:
        print(f.read(3).decode('utf-8'))   #rb模式,read读的是字节   #我
        f.seek(6,0)    #seek移动6个字节
        print(f.read(3).decode('utf-8'))    #

      seek参数为1,2的时候:(只能在b模式下使用)

    with open(r'test','rb') as f:
        print(f.read(3).decode('utf-8'))   #rb模式下,数字代表字节   #我
        f.seek(3,1)            #数字1代表光标在当前位置
        print(f.read(6).decode('utf-8'))    #读6个字节     #让你
    
    with open(r'test','rb') as f:
        print(f.read())    #rb模式读取全部
        f.seek(-6,2)       #数字2代表光标在最后,-6代表光标往前走6个字节
        print(f.read().decode('utf-8'))   #光标在倒数6个字节前面读取所有文件

      前面的都是seek光标读取,我们还可以写入,用r+模式  

    with open(r'test','r+',encoding='utf-8') as f:
        f.seek(3,0)    #光标从开头数3个字节
        f.write('')    #在‘我’后面加上'过'

      做一个文件内容更改检测:(另外一个程序对文件test01.txt加入一行文字,每次加入的文字光标都会在最后)

    先运行检测文件内容,让循环一直开着,现在光标在文件最后面,然后运行写入操作,文件写入一行,被循环捕捉到内容打印出来,因为文件写入是a追加模式,所以光标放在最后面。
    输入新内容又被循环捕捉到打印出来,这样一直循环。
    with open(r'test01.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'))

      截断文件操作:(注意:参数填的是字节数)

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

    三、修改文件

      第一种方法:在同一个文件中操作(注意:在同一个with下面不能读又写同一个文件

    #操作步骤
    #1.先将数据读取到内存中(读文件)
    #2.在内存中进行修改(字符串的替换)
    #3.再覆盖原文件(写文件)
    
    with open(r'test02.txt','r',encoding='utf-8') as f:
        data = f.read()   #读取文件所有内容
        print(data)
        print(type(data))
    
    with open(r'test02.txt','w',encoding='utf-8') as f:
        res = data.replace('egon','jason')   #修改内容
        print(data)
        f.write(res)   #重新写入文件,因为是w模式,把之前的内容都清空了
    优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
    缺点:当文件过大的情况下,可能会造成内存溢出

      第二种方法:不在同一个文件中操作(创建一个新文件,把老文件删除

    #操作步骤
    #1.新建一个新文件
    #2.把老文件的内容读取出来,修改内容,放在新文件中
    #3.删掉老文件
    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: new_line = line.replace('jason','egon') write_f.write(new_line) os.remove('test02.txt') #删掉这个文件 os.rename('test02.swap','test02.txt') #把test02.swap替换成test02.txt
    优点:内存中始终只有一行内容 不占内存
    缺点:再某一时刻硬盘上会同时存在两个文件

     读取文件的时候也可以用for循环读出每一行的内容

        

      

  • 相关阅读:
    Mac OS X 下安装Raspbian系统
    Tiny4412 uboot Makefile 分析
    Tiny4412增强版底板串口电路与设置
    为Debian搞定Mercury MW150US无线网卡驱动
    树莓派的启动过程
    xml格式转换为Bean
    j2ee之hibernate工具类
    验证码代码
    j2ee之AJAX的二级联动
    j2ee之原生AJAX
  • 原文地址:https://www.cnblogs.com/wangcuican/p/11153000.html
Copyright © 2011-2022 走看看