介紹如何在 Python 指令稿中從標準輸入讀取資料,並提供實際的應用範例程式碼。
input
讀取單行資料
Python 的 input
函數可以輸出提示訊息,並從標準輸入讀取一行文字資料,對於互動式的 Python 指令稿來說,預設的標準輸入就是鍵盤,所以這種方式時常用來讓使用者從鍵盤輸入資料:
# 從標準輸入中讀取資料 text = input("請輸入文字:") print("您輸入的文字為:", text)
假設我們將上面這段指令稿儲存為 script1.py
,在執行之後就可以從鍵盤輸入資料:
# 執行互動式指令稿
python3 script1.py
請輸入文字:Hello 您輸入的文字為: Hello
除了以鍵盤輸入資料之外,亦可透過管線的方式將資料導入指令稿的標準輸入:
# 將資料導入指令稿的標準輸入 echo "Hello" | python3 script1.py
請輸入文字:您輸入的文字為: Hello
透過管線導入資料時,輸入的資料不會像鍵盤輸入那樣顯示在螢幕上,但是資料一樣可以被程式讀取到,當遇到既有的互動式指令稿需要大量批次執行時,在不更動指令稿的狀況下,就可以使用這種方式處理。
sys.stdin.readline
讀取單行資料
除了 input
之外,也可以用 sys.stdin.readline
來讀取單行資料:
import sys print("請輸入文字:") # 從標準輸入中讀取資料 text = sys.stdin.readline() # 去除結尾處換行字元 text = text.rstrip() print("您輸入的文字為:", text)
假設我們將上面這段指令稿儲存為 script1.py
,在執行之後就可以從鍵盤輸入資料:
# 執行互動式指令稿
python3 script2.py
請輸入文字: Hello 您輸入的文字為: Hello
亦可透過管線導入資料:
# 將資料導入指令稿的標準輸入 echo "Hello" | python3 script2.py
請輸入文字: 您輸入的文字為: Hello
sys.stdin.readline
讀取多行資料
假設 lines.txt
的檔案內容如下:
line1 line2 line3
若要讀取多行資料,可以透過多次呼叫 sys.stdin.readline
來處理:
import sys while True: # 讀取單行資料 line = sys.stdin.readline() # 若沒有資料,則跳出 if not line: break # 去除結尾處換行字元 line = line.rstrip() print(line)
將上面這段指令稿儲存為 script3.py
後,即可執行以下指令透過標準輸入讀取 lines.txt
的檔案內容:
# 透過標準輸入讀取 lines.txt 的檔案內容 python3 script3.py < lines.txt
line1 line2 line3
sys.stdin.readlines
讀取多行資料
若檔案大小不大,也可以使用 sys.stdin.readlines
一次將整個檔案內容全部讀進一個列表(list)中:
import sys # 將多行資料讀取成為一個 list lines = sys.stdin.readlines() # 去除每行結尾處換行字元 lines = [l.rstrip() for l in lines] print(lines)
將上面這段指令稿儲存為 script4.py
後,即可執行以下指令透過標準輸入讀取 lines.txt
的檔案內容:
# 透過標準輸入讀取 lines.txt 的檔案內容 python3 script4.py < lines.txt
['line1', 'line2', 'line3']
搭配 for
迴圈逐行處理也是很常見的做法:
import sys # 以迴圈逐行處理 for line in sys.stdin.readlines(): # 去除結尾處換行字元 line = line.rstrip() print(line)
fileinput.input
讀取各種輸入資料
Python 的 fileinput
模組可以用來快速讀取來自於標準輸入或檔案的資料,概念類似 Perl 的 <>
運算子。
fileinput.input
會自動將所有命令列所指定的參數(sys.argv[1:]
)視為輸入檔案,將這些檔案內容串接起來依序逐行讀入,若在參數列中沒有指定任何檔案,則會自動從標準輸入讀取資料。
import fileinput # 以迴圈逐行處理 for line in fileinput.input(): # 去除結尾處換行字元 line = line.rstrip() print(line)
將上面這段指令稿儲存為 script5.py
後,即可執行以下指令讀取標準輸入或命令列參數指定的檔案內容:
# 透過標準輸入讀取 lines.txt 的檔案內容 python3 script5.py < lines.txt
line1 line2 line3
# 透過參數列指定檔案,讀取 lines.txt 的檔案內容
python3 script5.py lines.txt
line1 line2 line3
範例:多行合併
假設我們有一個檔案 raw1.txt
內容如下:
James 56.5 179.1 Jack 61.3 174.2
這個檔案中每三行是一筆個人的姓名、體重與身高資料,我們希望將這個檔案轉換成一個逗點分格(CSV)檔案,方便後續用 Excel 等軟體處理。
import fileinput counter = 0 record = [] # 以迴圈逐行處理 for line in fileinput.input(): # 去除結尾處換行字元 line = line.rstrip() # 加入欄位資料 record.append(line) # 湊足完整欄位時輸出一筆資料 if counter == 2: print(",".join(record)) record = [] counter = ( counter + 1 ) % 3
將此指令稿儲存為 join.py
後,執行之:
# 合併多行資料
python3 join.py raw1.txt
James,56.5,179.1 Jack,61.3,174.2
施先生 表示:
好+好,再+好 !!!
使我受益良多。
謝謝!