零基礎學習 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 的話,讀取的是從當前位置到行末的字母。

寫在之後

文件講完了,我們不只一次在這兩篇文章以及前面的文章中提到過「迭代」這個詞,文件是可迭代的,我們之前還講過其它可迭代的對象,所以迭代是一個我們必須要討論的知識點,明天敬請期待。

最後感謝你能看到這裡,希望我寫的東西能夠讓你有到收穫,但是我還是希望我在文章里插入的代碼,你們能自己動手試一下,都很簡單。原創不易,每一個字,每一個標點都是自己手敲的,所以希望大家能多給點支持,該關注關注,該點贊點贊,該轉發轉發,有什麼問題歡迎在後台聯繫我,也可以在公眾號找到我的微信加我。