• Python文件读写


    先说结论:

    文件r+ open:

      1. write()不能实现插入写,它总是覆盖写或附加写;

      2. 如果文件一打开即write(),则从开头覆盖写;

      3. 如果文件一打开,用f.seek()指定文件指针位置,然后执行f.write()则从指针位置写(覆盖写);

      4. 如文件打开后先执行了readline(), 然后再执行write(),实现的是附加写

    文件a+ open:

      1. 文件打开后起始指针为文件末尾,readline()将读不到数据

      2. write()始终是附加写 ,即使将文件指针指到中间再执行write()仍然附加写

    共性:

      1. write()是先写内存,f.close()时才将物理写入

      2. f.tell()函数把' '换行符当成一个字符而不是两个,计算偏移量时会是1不会是2

    测试过程:

    文件companies.txt内容:

    google
    tencent
    alibaba
    baidu

    r+模式:

    # python version: 3.6.3
    >>> f = open(r'python/file/companies.txt','r+') >>> f.tell() #查看文件指针值 0 >>> f.readline() #读一行 'google ' >>> f.tell() #再次查看文件指针值 7 >>> f.write('xxx') #在文件指针位置为7时,尝试写入字符串'xxx' 3 >>> f.tell() #再次查看文件指针值,已经变为文件末尾了 31 >>> f.readline() #再读一行,看下是读到eof还是接着读第二行 'tencent ' >>> f.readlines() #实际上还是读第二行,并未从文件指针处开始读,而且第二行中也没有之前写入的'xxx',那么'xxx'写到哪里去了呢?把剩下的行全部读出来 ['alibaba ', 'baidu'] >>> f.seek(0,0) #剩余的行也没有发现'xxx'。难道是附加在第一行后面吗?通过seek(0,0)把文件指针指到开头 0 >>> f.readlines() #读整个文件 ['google ', 'tencent ', 'alibaba ', 'baiduxxx'] >>> #最初写入的'xxx'其实是被附加到了文件末尾。说明用r+打开文件后,先用f.readline()读行,再f.write('xxx')的方式不能将字符串写入文件指针所在位置;而且,在write后是先写内存,并没有真的写进文件中,这时候readlines()是读不出来的,当执行f.seek()后readlines()才能读出。读出也不代表commit,真正的物理写入是在执行f.close()才发生的 >>> f.seek(0,0) #将文件指针置回开头 0 >>> f.write('bbb') #文件指针在开头的初始状态下使用write()方法写入字符串 3 >>> f.tell() #查看文件指针位置,经过write()处理后,指针是否又到末尾了呢? 3 >>> f.seek(0,0) #发现这次write()之后,指针并没有指到末尾,而是在文件开头.那么将指针指回0,后续再读整个文件,看写入的效果 0 >>> f.readlines() ['bbbgle ', 'tencent ', 'alibaba ', 'baiduxxx'] >>> # 'bbb'写到了文件开头,且是覆盖写,而不是插入。 >>> import os >>> print(os.SEEK_SET,os.SEEK_CUR,os.SEEK_END) #文件的起始位置,当前位置,结束位置常量 0 1 2 >>> f.seek(5,os.SEEK_SET) #将文件指针直接指到5 5 >>> f.tell() 5 >>> f.write('ttt') #再试一次,看看在没有执行readline情况下,调整指针位置后再write()的效果 3 >>> f.tell() 8 >>> f.seek(0,0) 0 >>> f.readlines() ['bbbgltttencent ', 'alibaba ', 'baiduxxx'] >>> #'ttt'竟然是从第5位开始写的!说明write()也可以在文件中间实现覆盖写,而不仅仅是在开头覆盖写或文件末尾附加写,但是前提是打开文件后不能readline,而要直接设置指针位置后调用write() >>> #总结:r+模式下,write()不能实现插入写,它总是覆盖写或附加写。如果文件一打开即write(),则从开头覆盖写;如文件打开后执行了readline(),然后再调用write(),实现的是附加写

    a+模式:

    >>> f = open(r'python/file/companies.txt','a+') # a+打开
    >>> f.tell() #初始指针位置
    28
    >>> #初始指针已经指向末尾
    >>> f.readline() #读一行, eof,读不到数据
    ''
    >>> f.write('aaa')  #写数据
    3
    >>> f.seek(0,0) #指针重置
    0
    >>> f.readlines() #读所有行
    ['google
    ', 'tencent
    ', 'alibaba
    ', 'baiduaaa']
    >>> # 'aaa'被附加到末尾了。这点和r+打开文件不同,r+打开文件后执行write()是从开头覆盖写
    >>> f.seek(5,0) #文件指针从文件起始位置正向偏移5
    5
    >>> f.tell()
    5
    >>> f.write('bbb') #再试试写,看是从位置5开始写还是从末尾附加
    3
    >>> f.seek(0,0) #重置指针
    0
    >>> f.readlines() #读所有行
    ['google
    ', 'tencent
    ', 'alibaba
    ', 'baiduaaabbb']
    >>> #'bbb'附加在末尾,说明即使指定了文件指针位置,a+模式下也不会从文件中部写入,始终附加写入
  • 相关阅读:
    设备上下文相关函数 冷夜
    DirectxDraw加载位图 冷夜
    MMO游戏数值框架概述(偏模拟方向) 冷夜
    C++基本数据类型列表 冷夜
    Ryzom相关的项目简介 冷夜
    使用QueryPerformanceFrequency 计算程序执行时间 冷夜
    C和C++运算符 冷夜
    编译错误记录文档 冷夜
    ANSI编码对比表 冷夜
    mscorsvw.exe是什么 冷夜
  • 原文地址:https://www.cnblogs.com/huahuayu/p/8093867.html
Copyright © 2020-2023  润新知