zoukankan      html  css  js  c++  java
  • 文件指针的移动 添加

    文件指针移动

    大前提:文件内指针的移动是Bytes为单位的,唯独t模式下的read读取内容个数是以字符为单位

    f.read(3)

    with open('a.txt',mode='rt',encoding='utf-8') as f:

        data=f.read(3)

        print(data)

    with open('a.txt',mode='rb') as f:

        data=f.read(3)

        print(data.decode('utf-8'))

    f.seek(指针移动的字节数,模式控制): 控制文件指针的移动

    模式控制:

    0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的

    1: 该模式代表指针移动的字节数是以当前所在的位置为参照的

    2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的

    强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

    f.tell()查看文件指针当前距离文件开头的位置

    0模式详解

    with open('a.txt',mode='rt',encoding='utf-8') as f:

        f.seek(4,0)

        print(f.tell())

        print(f.read())

    with open('a.txt',mode='rb') as f:

        f.seek(2,0)

        print(f.tell())

        print(f.read().decode('utf-8'))

    with open('a.txt',mode='rt',encoding='utf-8') as f:

        f.seek(5,0)

        print(f.read())

    1模式详解

    with open('a.txt',mode='rb') as f:

        f.seek(3,1)#停留在三后面

        print(f.tell())

        f.seek(4,1)#3+4=7光标在第七个字节后

        print(f.tell())

        print(f.read().decode('utf-8'))

    2模式详解

    with open('a.txt',mode='rb') as f:

        f.seek(-9,2)

        data=f.read()

        print(data.decode('utf-8'))

    tail -f access.log

    with open('access.log',mode='rb') as f:

        f.seek(0,2)

        while True:

            line=f.readline()

            if len(line) == 0:

                # 没有内容

                continue

            else:

                print(line.decode('utf-8'),end='')

    须知一:

    硬盘空间无法修改,硬盘中的数据更新都是用新的内容覆盖旧的内容

    内存控制可以修改

    with open('a.txt','r+t',encoding='utf-8') as f:

        f.seek(4,0)

        print(f.tell())

        f.write('我擦嘞')

    须知二:

    文件对应的是硬盘空间,硬盘不能修改应为文件本质也不能修改,

    我们看到文件的内容可以修改,是如何实现的呢?

    大的的思路:将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖回硬盘

    具体的实现方式分为两种:

    1. 将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件

    优点: 在文件修改过程中同一份数据只有一份

    缺点: 会过多地占用内存

    with open('db.txt',mode='rt',encoding='utf-8') as f:

        data=f.read()

    with open('db.txt',mode='wt',encoding='utf-8') as f:

        f.write(data.replace('kevin','SB'))

    # 2. 以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名

    优点: 不会占用过多的内存

    缺点: 在文件修改过程中同一份数据存了两份

    import os

    with open('db.txt',mode='rt',encoding='utf-8') as read_f,

            open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:

        for line in read_f:

            wrife_f.write(line.replace('SB','kevin'))

    os.remove('db.txt')

    os.rename('.db.txt.swap','db.txt')

  • 相关阅读:
    存储过程,触发器,函数 学习总结
    发布软件之前,怎样告诉用户怎么用
    一种小项目开发结构
    错误记录 两种实现方法
    模具行业生产知识
    请大家警惕这个散播木马的网站 www.zzyqr.com,本文简要地分析了它通过网页的传播方式
    如何保证开发过程中对数据库结构的更新顺利地迁移到产品服务器上。
    三层开发中容易犯的错误
    全局程序集缓存导致cs0006编译错误:找不到元数据文件错误
    for VS. foreach 那个性能更高,为什么,怎么选择
  • 原文地址:https://www.cnblogs.com/yanhui1995/p/9757191.html
Copyright © 2011-2022 走看看