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

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

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

交互式读一行用 input();处理管道数据用 sys.stdinsys.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。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台