• python基础(九)


     今日内容概要:

    一、控制文件指针移动(次重点)

    二、文件修改的两种方式(重点)

    内容详解:

    一、控制文件指针移动

     1、文件内指针移动的单位是什么?
     读出二进制解码得到的字符串:hello你好
    硬盘: 里面存放的是 0101010101101010101011010101010
    只有t模式下read(n),这个n代表的字符个数
    #f.tell()指的是:从文件开头计算起,告诉用户当前光标所在的位置
    with open('a.txt',mode='rt',encoding='utf-8') as f:
        data=f.read(6)
        print(f.tell())
        print(data)
    了解:硬盘容量的本质就是能存多个二进制数bit
    8bit=>1Byte
    1024Byte = 1KB
    1024KB=1MB
    1024MB=1GB
    1024GB=1TB
    1GB=1024*1024*8
    with open('a.txt',mode='rb') as f:
        data=f.read(8)
        print(type(data))
        print(len(data))
    
        print(data.decode("utf-8"))
    with open('b.txt',mode='rb') as f:
        data=f.read(7)
        print(type(data))
        print(len(data))
    
        print(data.decode("gbk"))#报错,因为此时运行的代码在utf-8下,要转换到gbk才行
    with open('a.txt',mode='r+t',encoding='utf-8') as f:
        f.truncate(7)#剪切出来前7个byte
    
    # 除此之外,所有的被动的、主动的文件指针移动的单位都是字节的个数
    2、 主动/单纯地控制文件指针移动
    f.seek(x,y)
    x代表的是移动的字节个数
    y代表的模式:
    0:代表参照物是文件开头,可以在t模式和b模块下使用
    with open('d.txt', mode='rt', encoding='utf-8') as f:
        f.read(3)
        print(f.tell())  # 5
    
        f.seek(3, 0)
        print(f.tell())  # 3
          1:代表参照物是当前位置,只能在b模式下用
    with open('d.txt', mode='rb') as f:
        f.read(1)
        print(f.tell()) # 1
        f.seek(2,1)
        print(f.tell()) # 3
        # print(f.read().decode("utf-8"))
          2:代表参照物是文件末尾,,只能在b模式下用
    with open('d.txt', mode='rb') as f:
        # f.seek(3333, 2)
        # print(f.tell()) # 14+3333=3347
    
        # f.seek(-3, 2)
        # print(f.tell())
    
        f.seek(0, 2)  # 快速将指针移动到文件末尾
        print(f.tell())
    
    with open('d.txt', mode='a') as f:
        print(f.tell())

    # 开发如下命令:

    # tail -f access.log
    import time
    with open(r"/day10/代码/access.log", mode="rb") as f:
        f.seek(0, 2)  # 快速将指针移动到文件末尾
    
        while True:
            line = f.readline()
            if len(line) == 0:
                time.sleep(0.1)
            else:
                print(line.decode('utf-8'),end='')
    
    

    二、文件修改的两种方式

     引入:硬盘数据没有改这么一说,都是用新内容覆盖老内容
    with open('e.txt', mode="r+t", encoding='utf-8') as f:
        f.seek(9, 0)
        f.write("你好")
    但是文件是可以修改的,但都是模拟出来的,如何实现,借助内存
    具体来说,有两种方式

    方式一原理:
    1、把硬盘存放该文件的内容全部读入内存
    2、在内存中把内容一次性修改完毕
    3、然后把修改完毕的结果覆盖回源文件
    方式一应用:word,vim,nodpad++等编辑器
    with open('f.txt', mode='rt', encoding='utf-8') as read_f:
        data = read_f.read()
        # print(data)
        res=data.06
    
    with open('f.txt', mode='wt', encoding='utf-8') as write_f:
        write_f.write(res)
    总结方式一:
    优点:不费硬盘,硬盘数据只有一份
    缺点:费内存,文件过大时内存占用过多

    方式二原理:

    1、把硬盘存放该文件的内容一行一行地读入内存
    2、修改完毕就写入新文件
    3、最后用新文件覆盖源文件
    import os
    
    with open('f.txt', mode='rt', encoding='utf-8') as read_f,
            open(".f.txt.swap",mode='wt',encoding='utf-8') as write_f:
        for line in read_f:
            write_f.write(line.replace("egon",'===>EGON<==='))
    
    os.remove('f.txt')
    os.rename('.f.txt.swap', 'f.txt')
    总结方式二:
    优点:不费内存,内存同一时刻只有文件的一行内容
    缺点:费硬盘,在修改过程中硬盘上会同时存放两份数据

    拓展 
    写日志:
    import time
    with open('access.log', mode='at', encoding='utf-8') as f:
        f.write("%s egon给黄俊转了2个亿
    " %time.strftime("%Y-%m-%d %H:%M:%S"))
  • 相关阅读:
    调研当前大学生的三个痛点
    作业-- 统计文本文件中的字符数、单词数、行数
    我的课程表--项目需求分析
    Android随机生成四则运算
    校友信息管理&SNS互动平台之前言、目录及说明
    校友信息管理&SNS互动平台之技术框架选择
    校友信息管理系统&SNS互动平台之用户需求及概要设计
    WordPress文件上传与下载问题解决
    oc - NSArray基础用法总结
    AutoLayout 使用详细
  • 原文地址:https://www.cnblogs.com/guojieying/p/13092651.html
Copyright © 2020-2023  润新知