介紹如何在 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
