零基礎學習 Python 之文件(二)
- 2019 年 11 月 7 日
- 筆記
大家好,這裡是零基礎學習 Python 系列,在這裡我將從最基本的Python 寫起,然後再慢慢涉及到高階以及具體應用方面。我是完全自學的 Python,所以很是明白自學對於一個人的考驗,所以在這裡我會盡我最大的努力,把 Python 儘可能簡單的表述清楚,讓更多想要學習 Python 的朋友能夠入門。同時寫這個教程也算是對自己之前所學知識的一個鞏固和提高,喜歡的朋友們可以點個關注,有問題歡迎隨時和我交流。本文所有的代碼編寫均是Python3 版本。
今天接着昨天的文章(零基礎學習 Python 之文件(一))接着往下進行,除去我們昨天說以後再講的,算是還剩下一點點比較有意思的點。
讀取文件的內容
因為文件的對象是可迭代的,所以能夠用open() 打開文件,所以用 for 循環可以將文件的內容讀出來。我在前面的文章說過,可以用 dir() 查看文件對象的屬性和方法,當你看了以後你會發現有 3 個方法 read / readline / readlines,單單從名稱上看,它們應該和讀有關係,事實上確實是這樣的,但是它們 3 個又有些微的差別。
1.read()
文件對象的 read() 方法,其實完整的寫出來其實是 read( size ),只不過裏面的參數可以省略,如果不省略,則讀取文件中的 size 個字符並返回一個字符串;如果省略的話,則讀取文件對象的字符知道 EOF,EOF == End – of – file。
>>> f = open('new.txt') >>> f.read(10) 'this is a ' >>> f.read() 'new filewith is good good good.』
如果你是按照上述的例子依次進行操作的,就會在 f.read() 後出現上述的結果,這主要是因為在前面已經 read(12) 了,指針已經移動到了第 12 個字符後面。
2.readline() & readlines()
readline() 就是它表面的意思,逐行讀取文件的內容。
>>> f = open('new.txt') >>> f.readline() 'this is a new filewith is good good good.' >>> f.readline() ''
每次執行 readline() 的時候它只讀一行,直到最後一行,如果還執行 readline() 的話,它不會報錯,返回的是空字符串。
同樣也是有 readline(size) 的,如果給 readline(size) 參數,則讀取相應行的 size 個字符,有興趣的可以自己試一下。
還有一個是 readlines(),它的作用是將文件中各行讀出來,放到一個列表中返回。
>>> f = open('test.txt') >>> f.readlines() ['My name is Rockyn', 'I love Python』]
既然返回的是一個列表,那麼就能用 for 循環讀取列表元素,再觀察一下可以發現,列表中的每個元素都是文件的一行,並且是字符串。
>>> f = open('test.txt') >>> for line in f.readlines(): ... print(line) ... My name is Rocky I love Python
這個是不是讓你想起了昨天的文章中對文件的 for 循環?
>>> f = open('test.txt') >>> for line in f: ... print(line) ... My name is Rocky I love Python
乍一看兩種方式好像沒有什麼區別,其實這兩種方式是不同的。在 for line in f 中,並沒有將文件中所以的行都讀入內存,而 for line in f.readlines() 中先執行了 f.readlines(),在內存中有一個列表,列表中包含了所有文件的行,這就是兩種方式的區別。
大文件的讀取
上面的三個讀取文件內容的方法 read 和 readlines 都是一次性將全部的內容讀入內存,如果文件不是很大的話,這種做法能夠保證讀取的速度,但是如果文件內容很大,大到差不多內存那麼大或者更大的時候,就不能這麼做了。但是 Python 早就替你考慮到了,Python 中有一個 fileinput 模塊,可以使用它來操作。
>>> import fileinput >>> for line in fileinput.input('test.txt'): ... print(line,end = '') ... My name is Rocky I love Python
因為我沒有大的文件,只是為了演示一下這個模塊的用法,對於這個模塊更多的內容,可以在交互模式下用 dir() 去查看。
seek
不知道你有沒有奇怪過在之前的演示中,每次都要做 f = open(『***』) 類似的操作,否則就會出現下面的情況:
>>> f = open('test.txt') >>> for line in f: ... print(line) ... My name is Rocky I love Python >>> for line in f: ... print(line) ... >>>
是不是發現,當我們第二次循環文件的時候,既沒有報錯,也沒有顯示文件的內容,類似的現象在前面的 readline 中也出現過,這是因為讀取文件的時候,有指針隨着運動,當讀取結束時,指針就到了相應的位置。
當指針結束運動時,可以使用 tell() 告訴我們當前指針的位置。
>>> f = open('test.txt') >>> f.readline() 'My name is Rockyn' >>> f.tell() 17
現在我們來看 seek() 的能力,它能夠根據偏移量來移動指針。
>>> f.seek(0) 0
上面的意思是將指針移動到文件的開始,如果用 f.readline() 讀取的話,現在輸出的應該是文件的第一行:
>>> f.readline() 'My name is Rockyn』
其實還可以操縱指針到任何一個位置,請看下面的操作:
>>> f.seek(10) 10 >>> f.tell() 10
f.seek(10) 就是將位置定位到從開頭算起到第 10 個字符後面,這時候如果使用 readline 的話,讀取的是從當前位置到行末的字母。
寫在之後
文件講完了,我們不只一次在這兩篇文章以及前面的文章中提到過「迭代」這個詞,文件是可迭代的,我們之前還講過其它可迭代的對象,所以迭代是一個我們必須要討論的知識點,明天敬請期待。
最後感謝你能看到這裡,希望我寫的東西能夠讓你有到收穫,但是我還是希望我在文章里插入的代碼,你們能自己動手試一下,都很簡單。原創不易,每一個字,每一個標點都是自己手敲的,所以希望大家能多給點支持,該關注關注,該點贊點贊,該轉發轉發,有什麼問題歡迎在後台聯繫我,也可以在公眾號找到我的微信加我。