Python open with 用法與範例

本篇 ShengYu 介紹 Python open with 用法與範例,

以下 Python open with 用法與範例將分為這幾部份,

  • Python open with 開檔讀取文字檔
  • Python open with 指定讀取檔案的編碼格式
  • Python open with 開檔寫入文字檔
  • Python open with 開檔讀取二進制檔
  • Python open with 開檔寫入二進制檔

那我們開始吧!

Python open with 開檔讀取文字檔

Python 要讀取一個文字檔會先用 open 來開檔,在 open() 函式裡的第一個引數放入檔案路徑名稱,第二個引數為開檔模式,有讀檔模式、寫入模式或讀寫模式等等,讀檔模式就用 'r',像這樣寫,

1
2
3
4
5
6
7
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

f = open('xxx.txt', 'r')
text = f.read()
print(text)
f.close()

如果開檔有問題,例如要開啟的檔案不存在,open() 函式就會拋出一個 IOError 的錯誤,並且給出錯誤碼和詳細的資訊告訴你檔案不存在,

1
2
3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'xxx.txt'

如果開檔成功的話,那麼接下來可以使用 read() 一次讀取該檔案的全部內容,或者使用 readlines() 搭配迴圈一次讀取一行文字,最後當檔案使用完畢時需要使用 close() 函式來關閉檔案,在檔案的開檔與讀取過程中都有可能會產生 IOError 例外錯誤,一旦出現例外錯誤,後面的 f.close() 函式就執行不到了,所以為了保證無論過程中有無出錯都要能正確地關閉檔案,我們可以使用 try… finially 來達成,像下述範例這樣寫,

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

try:
f = open('xxx.txt', 'r')
text = f.read()
print(text)
except:
print('error')
finally:
f.close()

但這樣寫太繁瑣了,每次讀檔或寫檔都樣寫這樣的程式碼的話顯得很冗長。

好在 Python 提供了 with open 語句來解決這個問題,使用 Python with open 語句可以自動地幫我們呼叫 close() 關檔的動作,即使在 Python with open 語句裡發生例外也是一樣,而且這也是官方建議使用的方式,我們來看看 Python with open 語句怎麼寫,將上述範例改用 Python with open 語句後如下列範例所示,

1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

with open('xxx.txt', 'r') as f:
text = f.read()
print(text)

這寫法跟前述範例的 try… finially 寫法效果是一樣的,但是 Python with open 語句的程式碼明顯地更精簡更少,而且還不用呼叫 close() 函式關檔。

在某些情況下用 f.read() 是比較快速的選擇,例如檔案內容大小很小時,但有時可能不會採用一次全部讀取的方式,例如檔案內容超大無法一次讀取到記憶體,或者想要分批每次一行處理,如果是想每次處理一行的話可以使用 readlines() 搭配迴圈像這樣寫,

1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

with open('xxx.txt', 'r') as f:
for line in f.readlines():
print(line)

Python open with 指定讀取檔案的編碼格式

Python open with 要指定讀取檔案的編碼格式,在 open() 設定 encoding 編碼格式即可,例如 Big-5 就這樣寫,

1
2
3
with open('xxx.txt', 'r', encoding='Big5') as f:
# or
f = open('xxx.txt', 'r', encoding='Big5')

UTF-8 就這樣寫,

1
2
3
with open('xxx.txt', 'r', encoding='UTF-8') as f:
# or
f = open('xxx.txt', 'r', encoding='UTF-8')

為了解決各種編碼問題,例如簡體中文與繁體中文,通常我們都會把編碼統一都轉成萬國碼 unicode。

如果遇到編碼錯誤,例如 UnicodeDecodeError,這可能是檔案中包含的未定義的編碼字元,遇到這種狀況如果要忽略的話,可以這樣寫,

1
2
3
with open('xxx.txt', 'r', encoding='Big5', errors='ignore') as f:
# or
f = open('xxx.txt', 'r', encoding='Big5', errors='ignore')

Python open with 開檔寫入文字檔

這邊介紹 Python open with 開檔寫入文字檔的範例,根據前述讀取文字檔介紹的差不多,在寫入文字檔時 open() 開檔要用 w 模式,

原本的開檔寫入文字檔的寫法為這樣,用 write() 將文字寫入檔案裡,在作業系統裡會有一個緩衝區,直到緩衝區滿了才會真正寫入硬碟裡,除非使用 flush() 強制將緩衝區寫入硬碟了,或者 close() 也會將緩衝區剩下的資料寫入硬碟裡,所以沒有正確 close() 關閉檔案的文字檔很容易看到檔案尾巴是資料不完整的狀況,

1
2
3
4
5
6
7
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

f = open('xxx.txt', 'w')
f.write('apple\n')
f.write('banana\n')
f.close()

所以這時要碼要用 try… finially 寫法來正確的處理例外以及關檔,或者可以使用 Python open with 的寫法,如下所示,

1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

with open('xxx.txt', 'w') as f:
f.write('apple\n')
f.write('banana\n')

Python open with 開檔讀取二進制檔

上述範例都是介紹文字檔的讀取與寫入,這邊要介紹二進制檔案的讀取,Python open with 讀取二進制檔案就需要在開檔模式裡加上 'b' 表示 binary 二進制模式,例如:二進制讀檔就要用 'rb',在上傳圖片、影片或其它檔案時就會用二進制開檔讀取,

原本的開檔讀取二進制檔寫法為這樣,

1
2
3
f = open('xxx.bin', 'rb')
# f.read()
# ...

改成 Python open with 來開檔讀取二進制檔案的寫法就會是這樣寫,

1
2
3
with open('xxx.bin', 'rb') as f:
# f.read()
# ...

Python open with 開檔寫入二進制檔

這一節介紹 Python open with 寫入二進制檔案,跟上一節概念相似,

原本的開檔寫入二進制檔寫法為這樣,

1
2
3
f = open('xxx.bin', 'wb')
# f.write()
# ...

改成 Python open with 來開檔寫入二進制檔案的寫法就會是這樣寫,

1
2
3
with open('xxx.bin', 'wb') as f:
# f.write()
# ...

以上就是 Python open with 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Python 新手入門教學懶人包