zoukankan      html  css  js  c++  java
  • 文件进阶

    指针

    指针移动的单位都是以bytes/字节为单位

    只有一种情况特殊:t模式下的read(n),n代表的是字符个数

    with open('aaa.txt',mode='rt',encoding='utf-8') as f:
        res=f.read(4)
        print(res)

    模式

    f.seek(n,模式):n指的是移动的字节个数

    1.模式0:参照物是文件开头位置
    f.seek(9,0)
    f.seek(3,0) # 3

    2.模式1:参照物是当前指针所在位置 f.seek(9,1) f.seek(3,1) # 12

    3.模式2:参照物是文件末尾位置,应该倒着移动 f.seek(-9,2) # 3 f.seek(-3,2) # 9

    强调:只有0模式可以在t下使用,1、2必须在b模式下用

    示范

    with open('aaa.txt',mode='rb') as f:
        f.seek(9,0)
        f.seek(3,0) # 3
        # print(f.tell())
        f.seek(4,0)
        res=f.read()
        print(res.decode('utf-8'))
    with open('aaa.txt',mode='rb') as f:
        f.seek(9,1)
        f.seek(3,1) # 12
        print(f.tell())
    with open('aaa.txt',mode='rb') as f:
        f.seek(-9,2)
        # print(f.tell())
        f.seek(-3,2)
        # print(f.tell())
        print(f.read().decode('utf-8'))

    指针的高级应用

    f.seek的高级应用,实时检测并记录输入的内容。

    分为2个文件:1个用于检测另1个用于输入

    #检测.py
    
    import time        # 导入时间模块
    with open('access.log', mode='rb') as f: 
        # r模式会将指针跳到文件开头
        # f.read() # 错误,不能逐行读取
        f.seek(0,2)    # 把指针移动到结尾
        while True:
            line=f.readline()
            if len(line) == 0:
                time.sleep(0.3)
            else:
                print(line.decode('utf-8'),end='')
    #输入.py
    
    with open('access.log', mode='at', encoding='utf-8') as f: # at为追加写模式
        f.write('20200311111112 yyy转账200w
    ')

    文件修改low

    在a.txt文件中的数据为:

    张一蛋     山东    179    49    12344234523
    李二蛋     河北    163    57    13913453521
    王全蛋     山西    153    62    18651433422
    
    执行代码:
    with open('a.txt',mode='r+t',encoding='utf-8') as f:
        res = f.read(9)    # 读取前9个字符:张一蛋     山
        print(res)
        f.seek(9,0)        # 把指针移到第9个bytes
        f.write('<男妇女主任>')    # 一个汉字对应3个bytes,此处共有3*5+2=17个bytes
    
    执行后,a.txt中的内容
    张一蛋<男妇女主任>9    49    12344234523
    李二蛋     河北    163    57    13913453521
    王全蛋     山西    153    62    18651433422

    文件修改的2种方式

    方式1:文本编辑采用的就是这种方式

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

      优点: 在文件修改过程中同一份数据只有一份
      缺点: 会过多地占用内存

    # 文件的读取
    
    with open('c.txt',mode='rt',encoding='utf-8') as f:
        res=f.read()
        data=res.replace('alex','dsb')
        print(data)
    # 文件的写入
    
    with open('c.txt',mode='wt',encoding='utf-8') as f1:
        f1.write('111')

    方式2:import os

    实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,

    修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名

      优点: 不会占用过多的内存
      缺点: 在文件修改过程中同一份数据存了两份

    在c.txt中的内容:
    alex is sb
    sb is alex
    egon is hahahahah

    执行文件
    import os # 导入OS模块 with open('c.txt', mode='rt', encoding='utf-8') as f, open('.c.txt.swap', mode='wt', encoding='utf-8') as f1: for line in f: f1.write(line.replace('alex', 'dsb')) # 把alex替换为dsb os.remove('c.txt') # 删除原文件 os.rename('.c.txt.swap', 'c.txt') # 把临时文件重命名为原文件

    执行后,c.txt中的内容 dsb is sb sb is dsb egon is hahahahah

    思维导图(点击链接

  • 相关阅读:
    强大的Excel文件的导入导出类
    按某一字段分组取最大(小)值所在行的数据
    oracle 数据库创建脚本
    六十四卦的名称
    DirectX与OpenGL方面的经典电子书下载
    替换word文件内容
    asp.net里导出excel表方法汇总
    全角半角处理
    JavaScript正则表达式
    Asp.net config connectionString配置(转)
  • 原文地址:https://www.cnblogs.com/zhww/p/12982911.html
Copyright © 2011-2022 走看看