Python 中如何读取标准输入(stdin)?

Python 读取 stdin 的三种方式:input() 读单行、sys.stdin 逐行/全量读取、fileinput 模块处理管道输入。本文对比各种方式及适用场景。

最佳实践
Python 中如何读取标准输入(stdin)?封面

交互式读一行用 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()

# 逐行读取;不要先调用 read() 消费至 EOF
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(生产者关闭管道、终端EOF,Unix常用Ctrl+D,Windows控制台常用Ctrl+Z后回车)才返回。需要实时处理就用 for line in sys.stdin 逐行读。

Q:input() 读到的都是字符串,怎么转数字?
A:int(input()) 或 float(input()),非法输入会抛 ValueError,记得 try/except。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台