• 文本编辑r+/w+/a+模式、光标移动及文件的截取与修改


    内容回顾:字符串与UTF-8之间的转化

    方法一:

    x = ''
    res1 = bytes(x,encoding='utf-8')  # 定义为bytes类型,encode
    print(res1,type(res1))  # b'xe4xb8x8a' <class 'bytes'>  转化完成
    res2 = str(res1,encoding='utf-8')  # 定义为字符串类型,decode
    print(res2,type(res2))  # 上 <class 'str'>转化完成

     方法二:

    x = ''
    res = x.encode('utf-8')  # 固定格式
    print(type(res))  # <class 'bytes'>
    print(res.decode('utf-8'))  # 上

     文本编辑其他模式:r+ , w+ ,  a+   (test.py文件里面初始内容为“你说啥”)

    r+模式:(默认为r+t)

    with open(r'test.py',mode='r+',encoding='utf-8') as f:
        print(f.readable())  # True
        print(f.writable())  # True
        print(f.readline())  # 你说啥
        f.write('嘿嘿嘿')  # 你说啥嘿嘿嘿
    
    # r+模式下文本可读可写

    ps:在r+t模式下,read内的数字表示的是字符的个数;除此之外,数字都表示的是字节。如:

    with open(r'test.py','rb') as f:
        res = f.read(6)  # 读的是三个字节bytes
        print(res)  # b'xe4xbdxa0xe8xafxb4'
        print(res.decode('utf-8'))  # 你说

    w+模式:(默认为r+t)

    with open(r'test.py',mode='w+',encoding='utf-8') as f:
        print(f.readable())  # True
        print(f.writable())  # True
        print(f.readline())  # 被清空
        f.write('嘿嘿嘿')  # 嘿嘿嘿
    
    # w+模式下可读可写,但是先清空文件内容再进行写入

    r+b模式:

    with open(r'test.py',mode='r+b') as f:
        print(f.readable())  # True
        print(f.writable())  # True
        res = f.read()  # 你说啥
    
    # r+t模式下可读可写

    文件内光标的移动:

    格式:f.seek(offset,whence)    

    offset:相对偏移量(光标移动的位数)

    whence:只能是0、1、2其中的一个;其中:

              0:参照文件的开头,t和b模式都可以使用;

         1:参照光标所在的当前位置,只能在b模式下使用;

         2:参照文件的末尾,只能在b模式下使用。

    PS:这里面的offset移动的都是字节数

    练习:实时监测文件内容:

    with open(r'test.py', 'r+b') as f :
        f.seek(0,2)  # 光标移动到最后
        while True :
            res = f.readline()
            print(f.tell())  # 查看光标移动了多少Bytes
            if res :
                print('新增的内容:%s'%res.decode('UTF-8'))
            else :
                print('暂无改动')

    截断文件truncate(n):括号内表示保留0~n个字节数,后面的全部删除(截断 )

    修改文件:两种方式。

    方式一:

    ①先将数据由硬盘读取到内存中(读文件)

    ②在内存中完成修改(字符串的替换)

    ③再覆盖原来的文件(写文件)

    # 测试01中的内容为(asdfghjk)
    with open(r'测试01.py','r',encoding='utf-8') as f:
        data = f.read()
        print(data)  # asdfghjk
        print(type(data))  # <class 'str'>
    
    with open(r'测试01.py','w',encoding='utf-8') as f:
        res = data.replace('a','z')
        print(data)  # asdfghjk
        f.write(res)
    #  测试01中的内容变为(zsdfghjk)

    优点:任意时间硬盘上只有一个文件,不会占用过多的硬盘空间。

    缺点:当文件过大时,可能造成内存溢出。

    方法二:

    ①创建一个新文件

    ②循环读取老文件内容到内存进行修改,并将修改好的内容写到新的文件中

    ③将老文件删除,将新的文件改成老文件名

    # 测试01中的内容为(asdfghjk)
    import os
    with open(r'测试01.py','r',encoding='utf-8') as read_f,
            open(r'测试01.py.swap','a',encoding='utf-8') as write_f:  # 表示新创建的文件
        for line in read_f:
            new_line = line.replace('a','z')  # 将f文件中的a改为z
            write_f.write(new_line)  # 在新文件中写入new_line的内容
    os.remove('测试01.py')  # 删除原文件
    os.rename('测试01.py.swap','测试01.py')  # 将新文件命名为老文件的名字
    
    #  测试01中的内容变为(zsdfghjk)

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

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

    函数:

    格式:def 函数名() :  # 函数名的命名规则与变量一样

        代码

       print(函数名())  

    # 可以通过变量名找到变量对应的值,而函数可以通过函数名()找到函数体对应的代码并执行。

    # 函数就是工具,必须先定义后调用(函数名+括号)

  • 相关阅读:
    几句让自己保留的动力的格言
    repo 的几个使用理解
    (转)汇编中断大全
    (转) 汇编.section和.text解释
    find 命令一些小技巧;
    android 系统使用c语言获取系统属性
    新的起点
    PDBC详细介绍
    PDBC(连接数据库)
    Python——基础知识
  • 原文地址:https://www.cnblogs.com/pupy/p/11151543.html
Copyright © 2020-2023  润新知