Python檔案讀寫


在本章中將介紹Python 3中可用的所有基本檔案讀取I/O功能。有關更多功能,請參考標準Python文件。

列印到螢幕

產生輸出的最簡單方法是使用print語句,可以傳遞零個或多個由逗號分隔的表示式。此函式將傳遞的表示式轉換為字串,並將結果寫入標準輸出,如下所示:

#!/usr/bin/python3

print ("Python是世界上最牛逼的語言,", "難道不是嗎?")

執行上面程式碼後,將在標準螢幕上產生以下結果 -

Python是世界上最牛逼的語言, 難道不是嗎?

從鍵盤讀取輸入

Python 2有兩個內建的函式用於從標準輸入讀取資料,預設情況下來自鍵盤。這兩個函式分別是:input()raw_input()

Python 3中,不建議使用raw_input()函式。 input()函式可以從鍵盤讀取數並作為字串型別,而不管它是否用引號括起來(「或」「)。

>>> x = input("input something:")
input something:yes,input some string
>>> x
'yes,input some string'
>>> x = input("input something:")
input something:1239900
>>> x
'1239900'
>>>

開啟和關閉檔案

在前面我們學習讀取和寫入標準的輸入和輸出。 現在,來看看如何使用實際的資料檔案。Python提供了預設操作檔案所必需的基本功能和方法。可以使用檔案物件執行大部分檔案操作。

開啟檔案

在讀取或寫入檔案之前,必須使用Python的內建open()函式開啟檔案。此函式建立一個檔案物件,該物件將用於呼叫與其相關聯的其他支援方法。

語法

file object = open(file_name [, access_mode][, buffering])

這裡是引數詳細資訊 -

  • file_name - file_name引數是一個字串值,指定要存取的檔案的名稱。
  • access_mode - access_mode確定檔案開啟的模式,即讀取,寫入,追加等。可能的值的完整列表如下表所示。 這是一個可選引數,預設檔案存取模式為(r - 也就是唯讀)。
  • buffering - 如果buffering值設定為0,則不會發生緩衝。 如果緩衝值buffering1,則在存取檔案時執行行緩衝。如果將緩衝值buffering指定為大於1的整數,則使用指定的緩衝區大小執行緩衝操作。如果為負,則緩衝區大小為系統預設值(預設行為)。

以下是開啟檔案使用的模式的列表 -

編號 模式 描述
1 r 開啟的檔案為唯讀模式。檔案指標位於檔案的開頭,這是預設模式。
2 rb 開啟僅用二進位制格式讀取的檔案。檔案指標位於檔案的開頭,這是預設模式。
3 r+ 開啟讀寫檔案。檔案指標放在檔案的開頭。
4 rb+ 以二進位制格式開啟一個用於讀寫檔案。檔案指標放在檔案的開頭。
5 w 開啟僅供寫入的檔案。 如果檔案存在,則覆蓋該檔案。 如果檔案不存在,則建立一個新檔案進行寫入。
6 wb 開啟僅用二進位制格式寫入的檔案。如果檔案存在,則覆蓋該檔案。 如果檔案不存在,則建立一個新檔案進行寫入。
7 w+ 開啟寫入和取讀的檔案。如果檔案存在,則覆蓋現有檔案。 如果檔案不存在,建立一個新檔案進行閱讀和寫入。
8 wb+ 開啟一個二進位制格式的寫入和讀取檔案。 如果檔案存在,則覆蓋現有檔案。 如果檔案不存在,建立一個新檔案進行閱讀和寫入。
9 a 開啟一個檔案進行追加。 如果檔案存在,則檔案指標位於檔案末尾。也就是說,檔案處於追加模式。如果檔案不存在,它將建立一個新檔案進行寫入。
10 ab 開啟一個二進位制格式的檔案。如果檔案存在,則檔案指標位於檔案末尾。 也就是說,檔案處於追加模式。如果檔案不存在,它將建立一個新檔案進行寫入。
11 a+ 開啟一個檔案,用於追加和閱讀。 如果檔案存在,則檔案指標位於檔案末尾。 檔案以附加模式開啟。 如果檔案不存在,它將建立一個新檔案進行閱讀和寫入。
12 ab+ 開啟一個二進位制格式的附加和讀取檔案。 如果檔案存在,則檔案指標位於檔案末尾。檔案以附加模式開啟。如果檔案不存在,它將建立一個新檔案進行讀取和寫入。

檔案物件屬性

開啟一個檔案並且有一個檔案物件後,可以獲得與該檔案相關的各種資訊。

以下是與檔案物件相關的所有屬性的列表 -

編號 屬性 描述
1 file.closed 如果檔案關閉則返回true,否則返回false
2 file.mode 返回開啟檔案的存取模式。
3 file.name 返回檔案的名稱。

注意 - Python 3.x中不支援softspace屬性

範例

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)
print ("Closed or not : ", fo.closed)
print ("Opening mode : ", fo.mode)
fo.close()

執行上面程式碼,這產生以下結果 -

Name of the file:  foo.txt
Closed or not :  False
Opening mode :  wb

close()方法

檔案物件的close()方法重新整理任何未寫入的資訊並關閉檔案物件,之後不能再進行寫入操作。
當檔案的參照物件重新分配給另一個檔案時,Python也會自動關閉一個檔案。但使用close()方法關閉檔案是個好習慣。

語法

fileObject.close();

範例

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)

# Close opened file
fo.close()

執行上面程式碼,這產生以下結果 -

Name of the file:  foo.txt

讀取和寫入檔案

檔案物件提供了一組存取方法,使程式碼編寫更方便。下面將演示如何使用read()write()方法來讀取和寫入檔案。

write()方法

write()方法將任何字串寫入開啟的檔案。 重要的是要注意,Python字串可以是二進位制資料,而不僅僅是文字。

write()方法不會在字串的末尾新增換行符(‘\n‘)

語法

fileObject.write(string);

這裡,傳遞引數 - string 是要寫入開啟檔案的內容。

範例

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "w")
fo.write( "Python is a great language.\nYeah its great!!\n")

# Close opend file
fo.close()

上述範例將建立一個foo.txt檔案,並將給定的內容寫入到該檔案中,最後將關閉檔案。 在執行上面語句後,如果開啟檔案(foo.txt),它將應該以下內容 -

Python is a great language.
Yeah its great!!

read()方法

read()方法用於從開啟的檔案讀取一個字串。 重要的是要注意Python字串除文字資料外可以是二進位制資料。。

語法

fileObject.read([count]);

這裡,傳遞引數 - count是從開啟的檔案讀取的位元組數。 該方法從檔案的開始位置開始讀取,如果count不指定值或丟失,則盡可能地嘗試讀取檔案,直到檔案結束。

範例

下面來一個檔案foo.txt,這是上面範例中建立的。

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)

# Close opened file
fo.close()

執行上面程式碼,這產生以下結果 -

Read String is :  Python is

檔案位置

tell()方法用於獲取檔案中的當前位置; 換句話說,下一次讀取或寫入將發生在從檔案開始處之後的多個位元組數的位置。

seek(offset [,from])方法更改當前檔案位置。 offset引數表示要移動的位元組數。 from引數指定要移動位元組的參照位置。

如果from設定為0,則將檔案的開頭作為參考位置。 如果設定為1,則將當前位置用作參考位置。 如果設定為2,則檔案的末尾將被作為參考位置。

範例

下面來一個檔案foo.txt,這是上面範例中建立的。

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)

# Check current position
position = fo.tell()
print ("Current file position : ", position)

# Reposition pointer at the beginning once again
position = fo.seek(0, 0)
str = fo.read(10)
print ("Again read String is : ", str)

# Close opened file
fo.close()

執行上面程式碼,這產生以下結果 -

Read String is :  Python is
Current file position :  10
Again read String is :  Python is

重新命名和刪除檔案

Python os模組提供用於執行檔案處理操作(如重新命名和刪除檔案)的方法。要使用此模組,需要先將它匯入,然後可以呼叫任何相關的函式。

rename()方法

rename()方法有兩個引數,即當前的檔案名和新的檔案名。

語法

os.rename(current_file_name, new_file_name)

範例

以下是一個將現有檔案test1.txt重新命名為test2.txt的範例 -

#!/usr/bin/python3
import os

# Rename a file from test1.txt to test2.txt
os.rename( "test1.txt", "test2.txt" )

remove()方法

使用remove()方法並通過提供要刪除的檔案的名稱作為引數來刪除檔案。

語法

os.remove(file_name)

範例

以下是刪除現有檔案test2.txt的範例 -

#!/usr/bin/python3
import os

# Delete file test2.txt
os.remove("text2.txt")

Python中的目錄

所有檔案都包含在各種目錄中,Python處理目錄問題也很容易。 os模組有幾種方法可以用來建立,刪除和更改目錄。

mkdir()方法

使用os模組的mkdir()方法在當前目錄中建立目錄。需要為此方法提供一個引數,指定要建立的目錄的名稱。

語法

os.mkdir("newdir")

範例

以下是在當前目錄中建立一個目錄:test 的範例 -

#!/usr/bin/python3
import os

# Create a directory "test"
os.mkdir("test")

使用chdir()方法來更改當前目錄。 chdir()方法接受一個引數,它是要選擇作為當前目錄的目錄的名稱。

語法

os.chdir("newdir")

範例

以下是進入「/home/newdir」目錄的範例 -

#!/usr/bin/python3
import os

# Changing a directory to "/home/newdir"
os.chdir("/home/newdir")

getcwd()方法

getcwd()方法用於顯示當前工作目錄。

os.getcwd()

範例

以下是給出當前目錄的一個例子 -

#!/usr/bin/python3
import os

# This would give location of the current directory
os.getcwd()

rmdir()方法

rmdir()方法刪除該方法中作為引數傳遞的目錄。刪除目錄之前,應刪除其中的所有內容。

os.rmdir('dirname')

範例

以下是刪除「/tmp/test」目錄的範例。需要給出目錄的完全限定名稱,否則將在當前目錄中搜尋該目錄。

#!/usr/bin/python3
import os

# This would  remove "/tmp/test"  directory.
os.rmdir( "/tmp/test"  )

檔案和目錄相關方法

有三個重要的來源,它們提供了廣泛的實用方法來處理和操作Windows和Unix作業系統上的檔案和目錄。它們如下 -