0%

Python 檔案處理

這篇我們來看看檔案的處理

Open & close

我們要做檔案讀寫時,一定要相進行開啟檔案,我們使用 open()

fileobj = open(filename,mode=’r’,encoding=None)

  1. fileobj : 是接 open( ) return 的檔案物件
  2. mode: 來指定檔案權限
  3. encoding: 編碼

以下是 mode 的 表示:

mode type 意義
r read only
w write only,如果 file 不存在會產生一個新的。如果存在會從頭寫入
x 只能用在檔案不存在的時候,新建檔案並且寫入
a 如果檔案存在,從檔案尾端(EOF)寫入
+ 如果是read可以write,是write可以read

使用完檔案之後要記得 close( ),將檔案關閉以節省資源。

如果忘記寫,當 function 結束時 Python 也會自己關掉,但還是不安全,如果在使用檔案的過程中發生了一些例外狀況,造成程式提早跳開時,這個開啟的檔案就會沒有被關閉。

所以我們可以使用 with 來幫忙我們。

1
with open('poem') as file:
2
    file.write(data)

這樣就行了,方便很多。

Write

使用 write( )open( ) 要有 w 的權限。

bytes = file.write(data)

write( ) 會 return 被寫入的 byte 數。但它跟 print( ) 不一樣,他不會 自動在尾端加入\n

我們也可以使用 print( ) 來寫入到 file,只要在 file 裡給予目標檔案即可。

print(data,file = myfile)

我們來實做一下,我們把詩經裡的<關鴡>寫入 poem 這個檔案。

1
file = open('poem',mode='w',encoding='utf-8')
2
3
poem = '''關關雎鳩,在河之洲。窈窕淑女,君子好逑。
4
5
參差荇菜,左右流之。窈窕淑女,寤寐求之。
6
7
求之不得,寤寐思服。悠哉悠哉,輾轉反側。
8
9
參差荇菜,左右采之。窈窕淑女,琴瑟友之。
10
11
參差荇菜,左右芼之。窈窕淑女,鐘鼓樂之。'''
12
13
file.write(poem)
14
15
file.close()

結果:

read() readline() readlines()

要使用 read( )open( ), 要有 r 的權限。

data = file.read(size)

read( ) return 他讀到的檔案內容, size是讀取檔案大小的上限,如果不寫的話是整份資料都讀取,如果檔案太大,那記憶體會哭的XD

我們來實做讀取剛剛的poem,但我們設置一次只能讀 10 個字元

1
file = open('poem',mode='r',encoding='utf8')
2
3
MAX_READ = 10
4
poem = ''
5
6
while True:
7
    data = file.read(MAX_READ)
8
    if not data:
9
        break
10
    print('data',data)
11
    poem += data
12
13
print('--------- poem --------')
14
print(poem)
15
file.close()

結果:

read( ) 沒讀到檔案時,會回傳 '' 空字串,所以 if not data 會是 True

我們也可以使用 readline( )一次讀入一行,什麼叫做一行? 就是讀到 '\n' 或者 EOF 就停止。跟 read( )一樣,沒讀到東西會 return 一個空字串。

1
file = open('poem',mode='r',encoding='utf8')
2
3
poem = ''
4
5
while True:
6
    line = file.readline()
7
    if not line:
8
        break
9
    print('line',line)
10
    poem += line
11
12
print('--------- poem --------')
13
print(poem)
14
file.close()

結果

每次讀一行都需要寫這個多 code,有沒有以較方便的方法呢?
我們可以使用 readlines( ), 他是把每一行都存入一個字串的 list(包括 \n),所以我們就可以使用 for 來迭代。

我們 print readlines( )的結果出來。

tell() & seek()

我們在做讀寫時, Python 都會追蹤我們在的檔案位置。 tell() 會從檔案的開頭起,return 你的位移值。
seek( )則是移動你的位移值到你想要的地方。

資料來源:

Python 學習筆記 系列