zoukankan      html  css  js  c++  java
  • 文件基础(三)

    文件内指针移动是以字节位单位的,唯独t模式下的read读取的内容个数是以字符为单位的
    f.read(3)
    rt读 指针指向开头 读取汉字
    with open(r'.txt',mode='rt',encoding='utf-8') as f:
    res=f.read(3)#从头开始读读三个字符
    print(res)

    rb读 指针指向开头 读取byte 3个byte就是一个汉字
    with open(r'.txt',mode='rb') as f:
    res=f.read(3)
    print(res.decode('utf-8'))

    f.seek(指针移动的字节数,模式控制):控制文件指针的移动
    模式控制:
    0:默认模式,该模式代表指针移动的字节数是文件以开头为参照的
    1:该模式代表指针移动的字节数是以当前所在的位置为参照的
    2:该模式代表指针移动的字节数是以文件末尾的位置为参展的
    强调:其中0模式可以在t或b模式使用,而1跟2模式只能在b模式下使用

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

    0模式详解:
    with open('.txt',mode='rt',encoding='utf-8') as f:
    f.seek(4, 0)
    print(f.tell())
    print(f.read())

    在b模式的0模式读取文件内容
    with open('.txt',mode='rb') as f:
    f.seek(4, 0)
    print(f.tell())
    print(f.read().decode('utf-8'))

    1模式详解:
    with open('.txt',mode='rb') as f:
    f.seek(3,1)
    print(f.tell())
    f.seek(4,1)
    print(f.tell())
    print(f.read().decode('utf-8'))

    2模式详解
    with open('.txt',mode='rb') as f:
    f.seek(-9,2)#倒着读 2模式
    data=f.read()
    print(data.decode('utf-8'))

    #tail -f access.log
    文件里写日志
    import time
    #print(time.strftime('%Y-%m-%d %X'))

    with open('a.txt',mode='at',encoding='utf-8') as f:
    f.write('%s 下雨了 ' %time.strftime('%Y-%m-%d %X'))

    对文件的时时监控输出
    with open('a.txt',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('.txt',mode='r+t',encoding='utf-8') as f:
    f.seek(4,0)
    print(f.tell())
    f.write('我的')
    内容直接覆盖 硬盘不能修改 都是用新的内容把原来之前的内容都覆盖掉


    须知二:
    文件对应的是硬盘空间,硬盘不能改应为文件本质也不能修改之所以我们看到文件的内容可以修改 是如何实现呢
    大的思路:将硬盘中文件内容读入内存 然后再内存中修改完毕后再覆盖
    具体实现方式分为两种
    1.将文件内容一次性全部读入内存 然后在内存中修改完毕后再覆盖写回源文件
    优点:在文件修改过程中同一份数据只有一份
    缺点:如果文件够大会过多的占用内存
    替换文件内容
    with open('.txt',mode='rt',encoding='utf-8') as f:
    data=f.read()

    with open('.txt',mode='wt',encoding='utf-8') as f:
    f.write(data.replace('abc','sb'))
    2.以读的方式打开原文件,以写的方式打开一个临时文件。。删掉原文件
    优点:不会占用过多的内存
    缺点:在文件修改过程中 同一份数据存了两份
    import os
    with open('.txt',mode='rt',encoding='utf-8') as read_f,open('1.txt',mode='wt',encoding='utf-8') as write_f:
    for line in read_f:
    write_f.write(line.replace('sb','abc'))
    os.remove('.txt')
    os.rename('1.txt','.txt')
    文件过大用方式2 文件不大用方式1

  • 相关阅读:
    Ubuntu中开启Telnet服务
    单片机串口通讯RXD与TXD如何对接详解
    KEIL, a Smart Comliler
    linux mail 命令(转载)
    VC程序在没装VC的机器中运行
    srand()以及rand()函数用法
    VC菜菜鸟:基于CFree的HelloWorld程序
    Keil使用中的若干问题(转)
    VMWARE 重新安装出错
    Linux个人学习笔记(编辑中)
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/11617292.html
Copyright © 2011-2022 走看看