Python

Python 從標準輸入讀取資料教學與範例

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

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago