Python 資料持久化 - 檔案 API



Python 使用內建的 input()print() 函式執行標準輸入/輸出操作。input() 函式從標準輸入流裝置(即鍵盤)讀取位元組。

另一方面,print() 函式將資料傳送到標準輸出流裝置(即顯示器)。Python 程式透過 sys 模組中定義的標準流物件 stdinstdout 與這些 I/O 裝置互動。

input() 函式實際上是 sys.stdin 物件的 readline() 方法的包裝器。從輸入流接收所有按鍵,直到按下“Enter”鍵。

>>> import sys
>>> x=sys.stdin.readline()
Welcome to TutorialsPoint
>>> x
'Welcome to TutorialsPoint\n'

請注意,readline() 函式留下尾隨的“\n”字元。還有一個 read() 方法,它從標準輸入流讀取資料,直到它被Ctrl+D 字元終止。

>>> x=sys.stdin.read()
Hello
Welcome to TutorialsPoint
>>> x
'Hello\nWelcome to TutorialsPoint\n'

類似地,print() 是一個模擬 stdout 物件的 write() 方法的便捷函式。

>>> x='Welcome to TutorialsPoint\n'
>>> sys.stdout.write(x)
Welcome to TutorialsPoint
26

就像 stdin 和 stdout 預定義的流物件一樣,Python 程式可以從磁碟檔案或網路套接字讀取資料並向其傳送資料。它們也是流。任何具有 read() 方法的物件都是輸入流。任何具有 write() 方法的物件都是輸出流。透過使用內建的 open() 函式獲取對流物件的引用來建立與流的通訊。

open() 函式

此內建函式使用以下引數:

f=open(name, mode, buffering)

name 引數是磁碟檔名或位元組字串,mode 是可選的單字元字串,用於指定要執行的操作型別(讀取、寫入、追加等),buffering 引數為 0、1 或 -1,分別表示緩衝區關閉、開啟或系統預設。

檔案開啟模式根據下表列舉。預設模式為“r”

序號 引數和描述
1

R

開啟以進行讀取(預設)

2

W

開啟以進行寫入,首先截斷檔案

3

X

建立一個新檔案並將其開啟以進行寫入

4

A

開啟以進行寫入,如果檔案存在則追加到檔案末尾

5

B

二進位制模式

6

T

文字模式(預設)

7

+

開啟磁碟檔案以進行更新(讀取和寫入)

為了將資料儲存到檔案,必須以“w”模式開啟它。

f=open('test.txt','w')

此檔案物件充當輸出流,並可以訪問 write() 方法。write() 方法將字串傳送到此物件,並將其儲存在底層檔案中。

string="Hello TutorialsPoint\n"
f.write(string)

關閉流非常重要,以確保緩衝區中剩餘的任何資料都完全傳輸到流中。

file.close()

嘗試使用任何文字編輯器(例如記事本)開啟“test.txt”以確認檔案的成功建立。

要以程式設計方式讀取“test.txt”的內容,必須以“r”模式開啟它。

f=open('test.txt','r')

此物件充當輸入流。Python 可以使用read() 方法從流中獲取資料。

string=f.read()
print (string)

檔案內容顯示在 Python 控制檯上。File 物件還支援readline() 方法,該方法能夠讀取字串,直到遇到 EOF 字元。

但是,如果以“w”模式開啟相同的檔案以在其記憶體儲其他文字,則先前的內容將被擦除。每當以寫入許可權開啟檔案時,它都被視為新檔案。要向現有檔案新增資料,請使用“a”表示追加模式。

f=open('test.txt','a')
f.write('Python Tutorials\n')

現在,檔案包含先前以及新新增的字串。檔案物件還支援writelines() 方法,將列表物件中的每個字串寫入檔案。

f=open('test.txt','a')
lines=['Java Tutorials\n', 'DBMS tutorials\n', 'Mobile development tutorials\n']
f.writelines(lines)
f.close()

示例

readlines() 方法返回一個字串列表,每個字串代表檔案中的每一行。也可以逐行讀取檔案,直到到達檔案末尾。

f=open('test.txt','r')
while True:
   line=f.readline()
   if line=='' : break
   print (line, end='')
f.close()

輸出

Hello TutorialsPoint
Python Tutorials
Java Tutorials
DBMS tutorials
Mobile development tutorials

二進位制模式

預設情況下,對檔案物件的讀取/寫入操作是對文字字串資料執行的。如果我們想要處理不同其他型別的檔案,例如媒體 (mp3)、可執行檔案 (exe)、圖片 (jpg) 等,我們需要在讀取/寫入模式中新增“b”字首。

以下語句將字串轉換為位元組並寫入檔案。

f=open('test.bin', 'wb')
data=b"Hello World"
f.write(data)
f.close()

也可以使用 encode() 函式將文字字串轉換為位元組。

data="Hello World".encode('utf-8')

我們需要使用“rb” 模式來讀取二進位制檔案。在列印之前,首先對 read() 方法的返回值進行解碼。

f=open('test.bin', 'rb')
data=f.read()
print (data.decode(encoding='utf-8'))

為了將整數資料寫入二進位制檔案,應使用to_bytes() 方法將整數物件轉換為位元組。

n=25
n.to_bytes(8,'big')
f=open('test.bin', 'wb')
data=n.to_bytes(8,'big')
f.write(data)

要從二進位制檔案讀回資料,請使用 from_bytes() 函式將 read() 函式的輸出轉換為整數。

f=open('test.bin', 'rb')
data=f.read()
n=int.from_bytes(data, 'big')
print (n)

對於浮點數資料,我們需要使用 Python 標準庫中的struct 模組。

import struct
x=23.50
data=struct.pack('f',x)
f=open('test.bin', 'wb')
f.write(data)

解包 read() 函式的字串,以從二進位制檔案中檢索浮點數資料。

f=open('test.bin', 'rb')
data=f.read()
x=struct.unpack('f', data)
print (x)

同時讀取/寫入

當檔案以寫入方式開啟(使用“w”或“a”)時,無法從中讀取,反之亦然。這樣做會引發 UnSupportedOperation 錯誤。我們需要在執行其他操作之前關閉檔案。

為了同時執行這兩個操作,我們必須在 mode 引數中新增“+”字元。因此,“w+”或“r+”模式允許使用 write() 和 read() 方法而無需關閉檔案。File 物件還支援 seek() 函式,可以將流倒帶到任何所需的位元組位置。

f=open('test.txt','w+')
f.write('Hello world')
f.seek(0,0)
data=f.read()
print (data)
f.close()

下表總結了檔案式物件可用的所有方法。

序號 方法和描述
1

close()

關閉檔案。關閉的檔案無法再讀取或寫入。

2

flush()

重新整理內部緩衝區。

3

fileno()

返回整數檔案描述符。

4

next()

每次呼叫時返回檔案中的下一行。在 Python 3 中使用 next() 迭代器。

5

read([size])

從檔案中讀取最多 size 個位元組(如果讀取在獲取 size 個位元組之前遇到 EOF,則位元組數更少)。

6

readline([size])

從檔案中讀取一整行。尾隨換行符保留在字串中。

7

readlines([sizehint])

使用 readline() 讀取直到 EOF 並返回包含行的列表。

8

seek(offset[, whence])

設定檔案的當前位置。0-開頭 1-當前 2-結尾。

9

seek(offset[, whence])

設定檔案的當前位置。0-開頭 1-當前 2-結尾。

10

tell()

返回檔案的當前位置

11

truncate([size])

截斷檔案的大小。

12

write(str)

將字串寫入檔案。沒有返回值。

廣告