Python 讀取 txt 文字檔,一篇搞懂!

本篇介紹 python 讀取 txt 文字檔的方法,python 讀檔是檔案處理的必備技能,在資料處理時常需要用 python 對 txt 文字檔讀取並進行一些加工處理,一般在 python 讀取文字檔有兩種情況,一種是邊讀邊處理,另一種是一次讀完再處理,這兩種方式要依當時情況來作決定,以上兩種情形都會在下列篇幅介紹,接著就馬上開始學習用 python 來讀檔吧!

以下內容分為這幾部份,

  • 最基本的讀檔寫法
  • open 開啟檔案的幾種模式
  • 一次讀取一行文字,逐步讀取
  • 一次讀取全部的文字
  • 使用 try…except…finally 語法處理例外 exception
  • 使用 with open() as
  • 讀取文字後用 split 切割欄位

那就開始進入主題吧!

最基本的讀檔寫法

Python 處理檔案中讀寫檔案是最常見的 IO 操作,透過檔案物件(File Object)所提供的介面來操作,檔案操作函式用法和 C 語言相似,
首先來認識 python 讀檔的基本步驟,開檔、讀檔、關檔,
一開始先開檔open(filename, mode),第一個參數填入要讀取的檔案名稱,
第二個參數填入開檔模式,這邊先使用 'r' 開檔且讀取,稍後會對開檔模式進行詳細說明,
所以實際上開檔會寫成這樣,

1
f = open('text.txt', 'r')

open() 開檔完後會回傳一個檔案物件 f
開檔成功後才能讀檔,讀檔上述有提到有兩種,
分別是一次讀一行f.readlines()跟一次讀全部f.read()
通常f.readlines()會需要搭配迴圈來一起使用,
接著把文字資料讀取進來後就可以對這些文字來進行處理,
或者是先 append 到 list 之後再處理,
最後要記得關檔f.close()

以下示範 python 讀檔 text.txt,
text.txt 內容如下,

text.txt
1
2
3
4
123
456
789
end

一開始先用 open() 開啟 text.txt 檔案,
之後再用 f.read() 把所有文字讀出並且印出,最後在 close() 關檔。

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

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

輸出:

1
2
3
4
123
456
789
end

open 開啟檔案的幾種模式

open() 函式的第二個參數開檔模式可分為下列幾種,
若不寫的話會以 r 為預設值,
r:開啟檔案讀取,檔案必須存在否則之後讀取會失敗(預設)
w:開啟檔案寫入,檔案不存在會新建檔案,檔案存在會覆蓋檔案
a:開啟檔案添加,在檔案尾巴開始附加寫入資料
r+:可讀可寫
w+:可讀可寫
a+:可讀可寫
b:二進位模式

一次讀取一行文字,逐步讀取

以下範例為一次讀取一行文字,
一開始先用 open() 開檔,再來每次迴圈使用 readlines() 來讀取一行文字,並且印出來,最後再 close() 關檔。

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

f = open('text.txt')
for line in f.readlines():
print(line)
f.close

你也可以這樣寫,先將讀取到的內容,先放到 text 這個 list 裡,
之後再做處理。

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

f = open('text.txt')
text = []
for line in f:
text.append(line)
print(text)

一次讀取全部的文字

一開始要 open() 開檔,再來使用 f.read() 把所有文字讀進變數裡,接著再將變數印出來。

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

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

使用 try…except…finally 語法處理例外 exception

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

1
2
3
4
Traceback (most recent call last):
File "./python3-txt-read.py", line 5, in <module>
f = open(path)
FileNotFoundError: [Errno 2] No such file or directory: 'text.txt'

以下範例與前一個範例不同之處是先用 readlines 一次讀出來到變數 lines 裡,
之後再用迴圈從 lines 讀取每一行的資料。

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

path = 'text.txt'
f = open(path, 'r')
lines = f.readlines()
for line in lines:
print(line)
f.close()

由於檔案讀寫時都有可能產生 IOError,一旦出錯,後面的 f.close() 就執行不到了,
為了保證不論有無出錯都能正確地關閉檔案,我們可以使用 try… finally 來達成,

python3-txt-read6.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

path = 'text.txt'
f = None
try:
f = open(path, 'r')
for line in f.readlines():
print(line)
except IOError:
print('ERROR: can not found ' + path)
if f:
f.close()
finally:
if f:
f.close()

輸出:

1
ERROR: can not found text.txt

使用 with open() as

使用 open() 開啟檔案後,最後一定要用 close() 來關閉檔案,那有沒有比較聰明的方式讓我們不會忘記做這件事呢?
Python 為你想到了,那就是使用 with…as 語法,Python 使用 with 語句來自動幫我們呼叫 close() 方法,並建議用這種寫法,
這效果和上述的 try... finally 是一樣的,但是程式碼更簡潔,並且不必呼叫 f.close() 方法,
所以實際上寫起來會是 with open() as 這樣,範例如下,

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

path = 'text.txt'
with open(path) as f:
for line in f.readlines():
print(line)

以下範例與前一個範例不同之處是先用 readlines 一次讀出來到變數 lines 裡,
之後再用迴圈從 lines 讀取每一行的資料,

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

path = 'text.txt'
with open(path) as f:
lines = f.readlines()
for line in lines:
print(line)

讀取文字後用 split 切割欄位

這邊示範將讀出來的每一行資料用 split 來切割欄位,並將欄位轉換成適當的變數類型,以逗號分隔的像是 csv 檔在另外一篇有介紹,這邊我們示範已空白作分隔,假設輸入的 text2.txt 內容是這樣,

1
2
3
4
1 Tom 87.3
2 Mary 76.4
3 Mark 65.5
4 Jason 54.6

那麼在 split 的參數指定要以空白字元作切割,最後再將其轉為對應的變數類型,例如轉整數用 int()、轉浮點數用 float(),放入對應的串列裡,以便後續處理,

python3-txt-read9.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

id = []
name = []
score = []
path = 'text2.txt'
with open(path) as f:
for line in f.readlines():
s = line.split(' ')
id.append(int(s[0]))
name.append(s[1])
score.append(float(s[2]))

print(id)
print(name)
print(score)

結果輸出如下,

1
2
3
[1, 2, 3, 4]
['Tom', 'Mary', 'Mark', 'Jason']
[87.3, 76.4, 65.5, 54.6]

下一篇我將會介紹 Python 寫入 txt 文字檔的範例。

其他參考
Python documentation open()
https://docs.python.org/3/library/functions.html#open
Python documentation readlines()
https://docs.python.org/3/library/io.html#io.IOBase.readlines

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 寫檔,寫入 txt 文字檔
Python 讀寫檔案
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 讓程式 sleep 延遲暫停時間
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放