1. 程式人生 > >python文件讀寫 - 文件r+ open讀寫實際表現

python文件讀寫 - 文件r+ open讀寫實際表現

打開 而不是 imp 指定 tell int 文件打開 aid end

先說結論:

文件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()函數把‘\n‘換行符當成一個字符而不是兩個,計算偏移量時會是1不會是2

測試過程:

文件companies.txt內容:

google
tencent
alibaba
baidu

r+模式:

# python version: 3.6.3
>>> f = open(rpython/file/companies.txt,r+) >>> f.tell() #查看文件指針值 0 >>> f.readline() #讀一行 google\n >>> f.tell() #再次查看文件指針值
7 >>> f.write(xxx) #在文件指針位置為7時,嘗試寫入字符串‘xxx‘ 3 >>> f.tell() #再次查看文件指針值,已經變為文件末尾了 31 >>> f.readline() #再讀一行,看下是讀到eof還是接著讀第二行 tencent\n >>> f.readlines() #實際上還是讀第二行,並未從文件指針處開始讀,而且第二行中也沒有之前寫入的‘xxx‘,那麽‘xxx‘寫到哪裏去了呢?把剩下的行全部讀出來 [alibaba\n, baidu] >>> f.seek(0,0) #
剩余的行也沒有發現‘xxx‘。難道是附加在第一行後面嗎?通過seek(0,0)把文件指針指到開頭 0 >>> f.readlines() #讀整個文件 [google\n, tencent\n, alibaba\n, 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\n, tencent\n, alibaba\n, 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\n, alibaba\n, baiduxxx] >>> #‘ttt‘竟然是從第5位開始寫的!說明write()也可以在文件中間實現覆蓋寫,而不僅僅是在開頭覆蓋寫或文件末尾附加寫,但是前提是打開文件後不能readline,而要直接設置指針位置後調用write() >>> #總結:r+模式下,write()不能實現插入寫,它總是覆蓋寫或附加寫。如果文件一打開即write(),則從開頭覆蓋寫;如文件打開後執行了readline(),然後再調用write(),實現的是附加寫

a+模式:

>>> f = open(rpython/file/companies.txt,a+) # a+打開
>>> f.tell() #初始指針位置
28
>>> #初始指針已經指向末尾
>>> f.readline() #讀一行, eof,讀不到數據
‘‘
>>> f.write(aaa)  #寫數據
3
>>> f.seek(0,0) #指針重置
0
>>> f.readlines() #讀所有行
[google\n, tencent\n, alibaba\n, 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\n, tencent\n, alibaba\n, baiduaaabbb]
>>> #‘bbb‘附加在末尾,說明即使指定了文件指針位置,a+模式下也不會從文件中部寫入,始終附加寫入

python文件讀寫 - 文件r+ open讀寫實際表現