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 圖片縮放

Python input 取得鍵盤輸入

本篇要介紹如何使用 Python input 取得使用者鍵盤輸入,python input 是從標準輸入讀取一行文字,預設的標準輸入為鍵盤輸入,這在使用者互動的程式中經常使用到。

python 3.x 內建提供了 input() 函式從標準輸入讀入一行文字,
python 2.x 為 raw_input(),

Python 3.x 的 input

預設的標準輸入為鍵盤,所以 input 會讀取使用者從鍵盤輸入的資料,以下將介紹 python 3.x input() 的使用方式。

input() 的括號內是放的是輸入的提示訊息,例如範例中會先顯示 請輸入: 後才準備讓使用者輸入,

範例中 s 變數會儲存 input() 輸入的資料,不論收到什麼資料型態,s 一定是字串,

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

s = input('請輸入: ')
print('輸入的內容是: ', s)

輸出如下,

1
2
請輸入: hello
輸入的內容是: hello

如果你輸入的資料想要轉換為整數使用的話請用 int(s) 來作轉換,要轉換為浮點數的話請用 float(s) 來作轉換,其他類型之此類推,

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

s = input('請輸入整數: ')
n = int(s) + 10
print('輸入的整數加10的結果是: %d' % n)

輸出如下,

1
2
請輸入整數: 30
輸入的整數加10的結果是: 40

input() 詳情可以參考 https://docs.python.org/3/library/functions.html#input,
另外 python 也提供 python2 轉換到 python3 的工具 2to3,詳情請參考https://docs.python.org/3/library/2to3.html

Python 2.x 的 raw_input

這邊也順便附上 Python 2.x raw_input() 的寫法,

python-raw_input.py
1
2
3
4
5
#!/usr/bin/env python
# -*- coding: utf-8 -*-

s = raw_input('請輸入: ')
print('輸入的內容是: ' + s)

下一篇將介紹如何使用 if 陳述句來控制程式的流程

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 第一支 Python 程式
Python print 格式化輸出與排版
Python if else elif 用法教學與範例
Python str 字串用法與範例
Python list 串列用法與範例
Python set 集合用法與範例
Python dict 字典用法與範例
Python tuple 元組用法與範例

Python 第一支中文 Python 程式

本篇介紹如何用 python 寫第一支中文 “哈囉” 程式,讓這支程式呼叫 print 函式印出 “哈囉” 字串吧!

如果還沒有裝 python 環境的話,請看下列幾篇教學:
Windows 安裝 python 環境
Mac 安裝 python 環境
Ubuntu 安裝 python 環境

第一支中文 python 程式的範例

以下為第一支中文 python 的範例,新增一個檔案名稱叫 hello.py,內容如下所示,
第一行註解是宣告使用 python3,
第二行很重要,表示程式碼是要用utf-8格式編碼,這樣才會讓之後的中文顯示正常(註解也是),
再來就是使用 print 函式印出 “哈囉” 這個字串。

hello.py
1
2
3
4
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print('哈囉')

然後在命令列上輸入 python hello.py 指令,接著會看到下列輸出:

1
2
$ python hello.py
哈囉

如果有看到輸出 “哈囉” 的話,表示成功地寫出第一支中文 python 程式啦!
以上就是如何用 python 寫出第一支中文 “哈囉” 程式的介紹。

相關主題
Python 取得鍵盤輸入 input
Python 讀檔,讀取 txt 文字檔
Python 讀取 csv 檔案
Python 讀寫檔案

第一支 Python 程式

本篇介紹如何用 python 寫第一支 hello world 程式,讓這支程式呼叫 print 函式印出 hello world 字串吧!

如果還沒有裝 python 環境的話,請看下列幾篇教學:
Windows 安裝 python 環境
Mac 安裝 python 環境
Ubuntu 安裝 python 環境

第一支 python 程式的範例

以下為第一支 python 的範例,新增一個檔案名稱叫 helloworld.py,如下所示,
第一行註解是宣告使用 python3,再來就是使用 print 函式印出 hello world 這個字串。

helloworld.py
1
2
3
#!/usr/bin/env python3

print('hello world')

然後在命令列上輸入 python helloword.py 指令,接著會看到下列輸出:

1
2
$ python helloword.py
hello world

如果有看到輸出 hello world 的話,表示成功地寫出第一支 python 程式啦!
以上就是如何用 python 寫出第一支 hello world 程式的介紹。
下一篇將介紹四則運算,加法、減法、乘法、除法用法與範例

其它相關文章推薦
Python 新手入門教學懶人包
Python 取得鍵盤輸入 input
Python 讀檔,讀取 txt 文字檔
Python str 字串用法與範例
Python list 串列用法與範例
Python set 集合用法與範例
Python dict 字典用法與範例
Python tuple 元組用法與範例

Linux zip/unzip 壓縮/解壓縮用法與範例

本篇介紹在 Ubuntu/Linux 下如何使用 zip / unzip 來壓縮與解壓縮用法與範例。

壓縮指令

將所有 *.txt 的檔案壓成一個 test.zip 檔

1
zip test.zip *.txt

將 ABC 目錄壓縮成一個 test.zip 檔

1
zip test.zip ABC

解壓縮指令

解壓縮的話是直接使用 unzip 這個指令,範例如下:

1
unzip test.zip

如果要指定解壓縮到 output 的目錄下的話,範例如下:

1
unzip test.zip -d output

其它相關文章推薦
Linux 常用指令教學懶人包
Linux sed 字串取代用法與範例
Linux find 尋找檔案/尋找資料夾用法與範例
Linux cut 字串處理用法與範例
Linux tail 持續監看檔案輸出用法與範例
Linux grep/ack/ag 搜尋字串用法與範例
Linux tee 同時螢幕標準輸出和輸出到檔案用法與範例
Linux xargs 參數列表轉換用法與範例
Linux du 查詢硬碟剩餘空間/資料夾容量用法與範例
Linux wget 下載檔案用法與範例

Python 讓程式 sleep 延遲暫停時間

本篇 ShengYu 將介紹如何使用 Python 讓程式 sleep 延遲暫停時間。

time.sleep 函式會延遲暫停當前的執行緒,延遲暫停多久取決於帶入的參數,
設定單位是秒,可以接受浮點數,也就是說我想要延遲暫停 1.5 秒的話是可以的,範例如下:

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

print("sleep 1.5 seconds.")
time.sleep(1.5)
print("printed after 1.5 seconds.")

輸出如下:

1
2
sleep 1.5 seconds.
printed after 1.5 seconds.

以上就是如何使用 Python 讓程式延遲 / 暫停 / 睡眠的方法。

參考
[1] How can I make a time delay in Python? - Stack Overflow
https://stackoverflow.com/questions/510348/how-can-i-make-a-time-delay-in-python

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 計算程式執行時間
Python 取得系統當前時間
Python 新手入門教學懶人包
Python str 字串用法與範例
Python list 串列用法與範例
Python set 集合用法與範例
Python dict 字典用法與範例
Python tuple 元組用法與範例

使用 gcc / g++ 編譯 opencv 程式

本篇 ShengYu 將介紹如何使用 gcc / g++ 指令來編譯 opencv 程式,並且透過 pkg-config 指令來取得 opencv 編譯所需的參數。

以下範例為簡單的讀取 lena 圖片,詳細的介紹說明請看 這篇

opencv-read-picture.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ opencv-read-picture.cpp `pkg-config --cflags --libs opencv`
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
Mat image;
image = imread("lena.jpg", IMREAD_COLOR);

imshow("view", image);
waitKey(0);
return 0;
}

使用 g++ 編譯 opencv 程式

正常編譯的話通常是使用 g++ opencv-read-picture.cpp -o read-picture 就完成了,但是這邊還需要帶入 opencv 的標頭檔目錄與連結函式庫,
這邊使用 pkg-config 這個工具來輔助完成這件事,最後透過結合這兩個指令就可以編譯出執行檔,

1
g++ opencv-read-picture.cpp -o read-picture `pkg-config --cflags --libs opencv`

pkg-config 原理

使用 pkg-config --cflags opencv 指令會輸出 opencv 所需要的標頭檔目錄,
輸出如下:

1
-I/usr/local/include/opencv -I/usr/local/include

使用 pkg-config --libs opencv 指令會輸出 opencv 所需要連結的函式庫,
輸出如下(本篇使用opencv 3.4.7,使用其他版本或許輸出有些不同):

1
-L/usr/local/lib -lopencv_ml -lopencv_dnn -lopencv_highgui -lopencv_superres -lopencv_objdetect -lopencv_stitching -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_photo -lopencv_flann -lopencv_shape -lopencv_video -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core

如果結合–cflags 和 –libs 兩個一起使用的話 pkg-config --cflags --libs opencv 則會一起輸出標頭檔目錄與連結的函式庫,輸出如下(本篇使用opencv 3.4.7,使用其他版本或許輸出有些不同):

1
-I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_ml -lopencv_dnn -lopencv_highgui -lopencv_superres -lopencv_objdetect -lopencv_stitching -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_photo -lopencv_flann -lopencv_shape -lopencv_video -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core

以上就是使用 gcc / g++ 編譯 opencv 程式介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

相關主題
在 Ubuntu 下寫第一支 OpenCV 程式

Python 取得系統當前時間

本篇 ShengYu 將介紹如何使用 Python 取得系統當前時間,可以使用 python 的 time 模組或者 datetime 模組,
這兩種取得系統當前時間的使用方式在本篇都會介紹到。

使用 time 得到系統當前時間

以下範例是一個不斷地印出系統時間的範例,
使用 time.localtime() 來取得本地時間,再將本地時間轉換成想要的格式,最後再列印出來。

Python-get-current-time-and-date.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
while True:
localtime = time.localtime()
result = time.strftime("%Y-%m-%d %I:%M:%S %p", localtime)
print(result)
time.sleep(1)

輸出如下:

1
2
3
4
5
6
7
2019-10-11 10:24:13 PM
2019-10-11 10:24:14 PM
2019-10-11 10:24:15 PM
2019-10-11 10:24:16 PM
2019-10-11 10:24:17 PM
2019-10-11 10:24:18 PM
... .. ...

如果要顯示 24 小時制的話,可以把 %I 12 小時制改成 %H 24 小時制。

strftime 常用的格式化字串

以下為 strftime 常用的格式化字串,

格式化符號 說明
%Y 四位數的年份(000-9999)
%y 兩位數的年份(00-99)
%m 月(01-12)
%d 日(01-31)
%H 24 小時制的小時(00-23)
%I 12 小時制的小時(01-12)
%M 分鐘(00-59)
%S 秒(00-59)
%p AM 或 PM

使用 datetime 得到系統當前時間

使用 datetime 模組也可以取得系統當前時間,
直接用 datetime.now() 取得當前系統日期與時間後,再用 strftime 來格式化成字串,

Python-get-current-time-and-date2.py
1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from datetime import datetime

result = datetime.now().strftime("%Y-%m-%d %H:%M:%S %p")
print(result)

輸出如下:

1
2019-10-11 22:39:33 PM

參考
Python 中如何得到當前時間 | D棧 - Delft Stack
https://www.delftstack.com/zh-tw/howto/python/how-to-get-the-current-time-in-python/
Python time strftime() 方法 | 菜鸟教程
https://www.runoob.com/python/att-time-strftime.html

其它相關文章推薦
C++ 取得系統當前時間
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 計算程式執行時間
Python 讓程式 sleep 延遲暫停時間
Python str 字串用法與範例
Python list 串列用法與範例
Python set 集合用法與範例
Python dict 字典用法與範例
Python tuple 元組用法與範例
Python 讀檔,讀取 txt 文字檔
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 讓程式 sleep 延遲暫停時間
Python PIL 讀取圖片並顯示
Python OpenCV resize 圖片縮放