前面我們說(shuō)r模式下,文件指針會(huì)跳到開(kāi)始位置,然后f.read(),就是把這個(gè)文件的內(nèi)容一次性全部從硬盤讀入到內(nèi)存了。
這時(shí)候如果文件過(guò)大,f.read()就會(huì)有問(wèn)題。如果這個(gè)文件幾十個(gè)G,你還能用f.read()嗎?
r模式下,f.read()是文佳指針從開(kāi)頭讀到結(jié)尾,整個(gè)文件都給你度到內(nèi)存里面來(lái),內(nèi)存一下就給占滿了,這樣的話32G內(nèi)存都不夠你用的。
當(dāng)然文件小的話這樣做沒(méi)問(wèn)題,文件大的話就不行了。
現(xiàn)在我把讀到的內(nèi)容復(fù)制給res1,然后再打印一下res1.
with open(r'G:\PythonProject\學(xué)習(xí)\學(xué)習(xí)文件\date\a.txt', mode='rt', encoding='utf-8') as f:
...
res1=f.read()
print(res1)
接著我再用f.read()來(lái)讀一次。
with open(r'G:\PythonProject\學(xué)習(xí)\學(xué)習(xí)文件\date\a.txt', mode='rt', encoding='utf-8') as f:
...
res1=f.read()
print(res1)
res2=f.read()
print(res2)
為了區(qū)分一下兩次讀寫的內(nèi)容,我在前面打印一下分隔符,center功能,80個(gè)字符用橫杠填充。
然后第二次讀我也這么打印一下。
with open(r'G:\PythonProject\學(xué)習(xí)\學(xué)習(xí)文件\date\a.txt', mode='rt', encoding='utf-8') as f:
...
print('第一次讀'.center(80,'-'))
res1 = f.read()
print(res1)
print('第二次讀'.center(80,'-'))
res2 = f.read()
print(res2)
現(xiàn)在我要運(yùn)行這個(gè)程序的話會(huì)發(fā)生什么?我們先來(lái)分析一下,f.read()前面是說(shuō)過(guò),讀完后文件指針在末尾了。
第二次讀,的時(shí)候文件指針就已經(jīng)在末尾了 ,就什么也讀不到。
我們來(lái)運(yùn)行看看是不是分析的結(jié)果。
結(jié)果和我們分析的一樣。
所以只要我們呢個(gè)夠控制這個(gè)文件指針的移動(dòng)是不是就可以隨性所欲想讀哪段內(nèi)容就可以讀哪段內(nèi)容了。
也可以避免r模式下的f.read()會(huì)一次性把整個(gè)文件內(nèi)容讀入內(nèi)存,造成內(nèi)存被占滿的問(wèn)題。
控制文件指針是我們后面要講的,現(xiàn)在還有一個(gè)點(diǎn)你要注意。
你注意看,第一次讀完之后,有個(gè)換行。
為什么呢?我們的文件內(nèi)容不就是‘你好我喜歡你’這句話嗎?來(lái)看這個(gè)文件內(nèi)容。
這個(gè)文件里面本來(lái)就有個(gè)換行符,也就是說(shuō)\n,雖然這個(gè)\n我們看不見(jiàn),但是我們讀文件的時(shí)候這個(gè)\n也是會(huì)讀進(jìn)去的。
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » Python 文件指針