簡單介紹python程式設計之檔案讀寫

大雄45發表於2022-12-09
導讀 函式 open() 返回 檔案物件,通常的用法需要兩個引數: open(filename, mode) 。
f = open('workfile', 'w')

第一個引數是一個含有檔名的字串。第二個引數也是一個字串,含有描述如何使用該檔案的幾個字元。mode 為 'r' 時表示只是讀取檔案; 'w' 表示只是寫入檔案(已經存在的同名檔案將被 刪掉); 'a' 表示開啟檔案進行追加,寫入到檔案中的任何資料將自動新增到末尾。 'r+' 表示打 開檔案進行讀取和寫入。mode 引數是可選的,預設為 'r' 。

通常,檔案以 文字 開啟,這意味著,你從檔案讀出和向檔案寫入的字串會被特定的編碼方式(預設是UTF-8)編碼。模式後面的 'b' 以 二進位制模式 開啟檔案:資料會以位元組物件的形式讀出和寫入。這種模式應該用於所有不包含文字的檔案。在文字模式下,讀取時預設會將平臺有關的行結束符(Unix上是 \n , Windows上是 \r\n )轉換為\n 。

在文字模式下寫入時,預設會將出現的 \n 轉換成平臺有關的行結束符。這種暗地裡的修改對 ASCII 文字檔案沒有問題,但會損壞 JPEG 或 EXE 這樣的二進位制檔案中的資料。使用二進位制模式讀寫此類檔案時要特別小心。

檔案物件方法

本節中的示例都預設檔案物件 f 已經建立。要讀取檔案內容,需要呼叫 f.read(size) ,該方法讀取若干數量的資料並以字串形式返回其內 容,size 是可選的數值,指定字串長度。如果沒有指定 size 或者指定為負數,就會讀取並返回整 個檔案。當檔案大小為當前機器記憶體兩倍時,就會產生問題。反之,會盡可能按比較大的 size 讀取 和返回資料。如果到了檔案末尾, f.read() 會返回一個空字串( '' ):

>>> f.read()
'This is the entire file.\n'
>>> f.read()
''

f.readline() 從檔案中讀取單獨一行,字串結尾會自動加上一個換行符( \n ),只有當檔案最後一行沒有以換行符結尾時,這一操作才會被忽略。這樣返回值就不會有混淆,如果 f.readline() 返回一個空字串,那就表示到達了檔案末尾,如果是一個空行,就會描述為 '\n' ,一個只包含 換行符的字串:

>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''

你可以迴圈遍歷檔案物件來讀取檔案中的每一行。這是一種記憶體高效、快速,並且程式碼簡介的方式:

>>> for line in f:
... print(line, end='')
...
This is the first line of the file.
Second line of the file

如果你想把檔案中的所有行讀到一個列表中,你也可以使用 list(f) 或者 f.readlines() 。f.write(string) 方法將 string 的內容寫入檔案,並返回寫入字元的長度:

>>> f.write('This is a test\n')
15

想要寫入其他非字串內容,首先要將它轉換為字串:

>>> value = ('the answer', 42)
>>> s = str(value)
>>> f.write(s)
18

f.tell() 返回一個整數,代表檔案物件在檔案中的指標位置,該數值計量了自檔案開頭到指標處的位元數。需要改變檔案物件指標話話,使用 f.seek(offset,from_what) 。指標在該操作中從指定的引用位置移動 offset 位元,引用位置由 from_what 引數指定。 from_what 值為 0 表示自檔案起始處開始,1 表示自當前檔案指標位置開始,2 表示自檔案末尾開始。from_what 可以忽略,其預設值為零,此時從檔案頭開始:

>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2851361/,如需轉載,請註明出處,否則將追究法律責任。

相關文章