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

    一。文件模式

      1.在文件的操作中,也有很多补充 的模式可使用

      1.r+,可读可写模式,在此模式中,操作权限时可读可写,这里的写与write模式不一样的是,不再清空文件内容,写的内容添加到文件的后面,而光标依然再读取的操作地方。

      2.w+,可写可读模式,此模式读写都可以,但和w一样会在写的时候会将文件原先的内容删除。

      3.a+,可追加可读可写模式,此模式读写都可以,是再原先追加的情况下增加读写权限。

      2.read()

      read()在使用过程中是可以传参数的,当没有参数时,自动默认读取所有文件内容,传入int类型的数字后,会根据数字大小读取相应的字符。

    with open('text1','rt',encoding='utf-8') as f:
        res=f.read(4)
        print(res)
    #输出结果>>>我叫mt

      这里并非是根据字节数进行读取。

      3.seek()

      一个英文字符占一个字节,一个中文字符占三个字节。

      而seek()函数在操作文本文件时是根据字节数。

      seek(offset,whence)

      offset:相对偏移量。光标的移动位数,在移动时是按照字节数进行移动。

      whence:有三个参数可选,分别代表三个模式:

      0,参照文件开头,t和b都可以使用

    with open('text1','rt',encoding='utf-8') as f:
        f.seek(3,0)
        res=f.read(2)
        print(res)
    #输出结果>>>叫m(我叫mt)

      seek在移动光标时根据字节数,所以移动三位就是移动一位中文字。

      1,参照光标所在的当前位置,此模式只适用于b模式

    with open('text1','rb') as f:
        print(f.read(3))
        f.seek(3,1)
        res=f.read(2)
        print(res.decode())
    #输出结果>>>b'xe6x88x91'
    #mt(我叫mt)

      2,参照光标文件的末尾,此模式只能在b模式下使用

    with open('text1','rb') as f:
        f.read()
        f.seek(-3,2)
        res=f.read(3)
        print(res)
        print(str(res,encoding='utf-8'))
    #输出结果>>>b'xe4xbdxa0'
    #你(我叫mt你你你)

      小总结:在普通文本文件操作r模式下,read(1)代表的是读取的是一个字符,无论是中文还是英文,在b模式下读取的也是,一个字符相当于一个字节。seek()函数中位移光标是按照字节移动,三个模式中0模式可以在任意情况下使用,1,2模式只能在b模式下使用。

      例子

      使用文件操作,当文本文件添加新内容时,将添加的内容显示出来

      首先定义添加内容的过程:

    import time
    res = time.strftime('%Y-%m-%d %X')
    # print(res,type(res))
    with open(r'test01.txt','a',encoding='utf-8') as f:
        f.write('%s 老板发了1个亿的工资
    '%res)

      在将指针移到文件末端,循环读取一行内容,查看其内容:

    with open(r'test01.txt',mode='rt',encoding='utf-8') as f:
        f.read()
        while True:
            res=f.readline()
            if res:
                print('新增内容%s'%res)

      4.truncate(x)截断文件

      将x所标记的字节位之前的保留,其他内容全部删除。

    with open(r'test01.txt','a',encoding='utf-8') as f:
        f.truncate(6)  # 接收的字节的长度 整型
        # 保留0~6字节数 后面的全部删除(截断)
    #输出结果>>>我叫(我叫mt,我是无敌的)

      5.修改文件操作

      在修改文件操作中,一般有两种方式。

      1.(1)先将数据从硬盘读取到内存,

        (2)在内存中进行修改

          (3)将新的内容覆盖到旧的文件中

    with open('test01.txt',mode='r',encoding='utf-8') as f:
        data=f.read()
    with open('test01.txt',mode='w',encoding='utf-8') as f2:
        f2.write(data.replace("lzx",'yzy'))

      上代码中把‘lzx’替换成了’yzy‘,这种方式对内存的负担很大,在程序中,将文件的所有数据都保存在了data中,所以这个方法很耗内存。

      2.(1)创建一个新的文件

        (2)循环读取需要修改的文件,在内存中修改完后,将数据保存到新文件中

        (3)将老文件删除,新文件的名字改成老文件的名字

      为了完成这个程序,需要使用os包,中对文件名进行修改,

    import os
    with open('test01.txt',mode='rt',encoding='utf-8') as f,
        open('test01.swap',mode='wt',encoding='utf-8') as f2:
        for i in f:
            if 'yzy' in i:
                f2.write(i.replace('yzy','lzx'))
            if 'yzy' not in i:
                f2.write(i)
    os.remove('test01.txt')
    os.rename('test01.swap','test01.txt')
  • 相关阅读:
    回调那些事儿
    v-if和v-show小对比
    导出下载功能
    vue和react
    Redis 实现抢票
    MySQL 各种连接,
    MySQL的分组,降序 实现
    MySQL 窄表转宽表
    EX: 判断密码, 判断字符必须包含大写,小写,数字,特殊字符 ,并且键盘不能连续
    hive 基础
  • 原文地址:https://www.cnblogs.com/LZXlzmmddtm/p/11153434.html
Copyright © 2011-2022 走看看