Python 中如何读取标准输入(stdin)?
Python 读取 stdin 的三种方式:input() 读单行、sys.stdin 逐行/全量读取、fileinput 模块处理管道输入。本文对比各种方式及适用场景。
交互式读一行用 input();处理管道数据用 sys.stdin(sys.stdin.read() 读全部,for line in sys.stdin: 逐行);fileinput 模块可同时处理文件参数和 stdin。
方法一:input() 读一行
name = input("请输入名字: ")
print(f"你好, {name}")
阻塞等待用户输入一行,返回字符串(不含换行)。适合交互式脚本。
方法二:sys.stdin(管道处理的核心)
import sys
# 读取全部输入
data = sys.stdin.read()
# 逐行读取(处理管道大数据时内存友好)
for line in sys.stdin:
print(line.rstrip())
典型用法——让自己的脚本支持管道:
cat access.log | python3 filter.py | sort | uniq -c
方法三:fileinput 模块
import fileinput
for line in fileinput.input():
print(line.rstrip())
自动处理:script.py file1 file2 读文件,cat x | script.py 读 stdin——和 grep/awk 的行为一致。
判断是否有管道输入
import sys
if sys.stdin.isatty():
print("交互模式:没有管道输入")
else:
data = sys.stdin.read()
isatty() 返回 True 表示 stdin 是终端(用户在键盘前),False 表示有管道/重定向输入。
常见问题(FAQ)
Q:input() 能读密码吗?
A:密码输入用 getpass.getpass(),不回显;input() 会明文显示。
Q:read() 卡住不返回?
A:sys.stdin.read() 会等到 EOF(管道关闭或 Ctrl+D)才返回。需要实时处理就用 for line in sys.stdin 逐行读。
Q:input() 读到的都是字符串,怎么转数字?
A:int(input()) 或 float(input()),非法输入会抛 ValueError,记得 try/except。