pin_drop当前位置:知识文库 ❯ 图文
sys.stdin详解 - Python标准输入流与管道数据处理
概述
sys.stdin 是 Python 标准库中代表标准输入流(Standard Input)的文件对象。它默认连接到键盘输入,但也可以通过管道或重定向从文件或其他程序获取数据。sys.stdin 是构建交互式命令行程序和处理管道数据的基础,尤其在编写数据处理脚本和 Unix 风格工具时不可或缺。
语法
代码示例
import sys
# 读取一行
line = sys.stdin.readline()
# 读取所有内容
content = sys.stdin.read()
# 逐行迭代
for line in sys.stdin:
process(line)参数说明
sys.stdin 是一个文本文件对象(TextIOWrapper),支持以下常用方法:
代码示例
示例1:基本输入读取
代码示例
import sys
# 读取单行输入
print("请输入你的名字: ", end="")
name = sys.stdin.readline().strip()
print(f"你好, {name}!")
# 读取指定数量字符
print("请输入3个字符: ", end="")
chars = sys.stdin.read(3)
print(f"你输入的字符: '{chars}'")输出(假设输入 "Alice" 和 "ABC"):
代码示例
请输入你的名字: Alice
你好, Alice!
请输入3个字符: ABC
你输入的字符: 'ABC'示例2:逐行处理管道输入
将以下代码保存为 line_counter.py:
代码示例
import sys
def count_lines():
"""统计输入的行数、单词数和字符数"""
line_count = 0
word_count = 0
char_count = 0
for line in sys.stdin:
line_count += 1
word_count += len(line.split())
char_count += len(line)
print(f"行数: {line_count}")
print(f"单词数: {word_count}")
print(f"字符数: {char_count}")
count_lines()在命令行执行 python line_counter.py < data.txt,输出:
代码示例
行数: 10
单词数: 45
字符数: 320示例3:交互式菜单系统
代码示例
import sys
def interactive_menu():
"""交互式命令行菜单"""
tasks = []
while True:
print("\n===== 任务管理器 =====")
print("1. 添加任务")
print("2. 查看任务")
print("3. 删除任务")
print("4. 退出")
print("=====================")
sys.stdout.write("请选择操作: ")
sys.stdout.flush()
choice = sys.stdin.readline().strip()
if choice == "1":
sys.stdout.write("输入任务内容: ")
sys.stdout.flush()
task = sys.stdin.readline().strip()
tasks.append(task)
print(f"已添加: {task}")
elif choice == "2":
if tasks:
for i, task in enumerate(tasks, 1):
print(f" {i}. {task}")
else:
print("暂无任务")
elif choice == "3":
if tasks:
sys.stdout.write("输入任务编号: ")
sys.stdout.flush()
idx = sys.stdin.readline().strip()
try:
idx = int(idx) - 1
removed = tasks.pop(idx)
print(f"已删除: {removed}")
except (ValueError, IndexError):
print("无效编号")
else:
print("暂无任务")
elif choice == "4":
print("再见!")
break
else:
print("无效选择,请重试")
interactive_menu()输出:
代码示例
===== 任务管理器 =====
1. 添加任务
2. 查看任务
3. 删除任务
4. 退出
=====================
请选择操作: 1
输入任务内容: 学习Python
已添加: 学习Python实际应用场景
-
管道数据处理:在 Unix 管道中接收上游程序的输出,如
cat log.txt | python analyze.py -
交互式命令行工具:构建需要用户实时输入的交互程序,如配置向导、数据库客户端
-
批量数据导入:从重定向的文件中读取大量数据进行批量处理
注意事项
注意1:
sys.stdin.readline()保留末尾的换行符\n,通常需要使用.strip()去除。
注意2:当标准输入被重定向为文件时,
sys.stdin.isatty()返回False,可以利用这个特性判断程序是否在交互模式下运行。
注意3:
sys.stdin.read()在管道模式下会阻塞直到收到 EOF 信号(Ctrl+D 或 Ctrl+Z),在交互模式下需要手动发送 EOF。
提示:对于简单的用户输入,推荐使用
input()函数,它内置了提示信息功能和换行处理,更加方便。sys.stdin更适合处理管道输入和大量数据的场景。
相关方法对比
小结
-
sys.stdin是 Python 标准输入流对象,默认连接键盘,支持管道和重定向 -
常用方法包括
read()、readline()和迭代遍历,各有适用场景 -
处理管道数据时,推荐使用
for line in sys.stdin的迭代方式 -
简单交互输入推荐使用
input(),管道和批量数据处理推荐使用sys.stdin
练习题
练习1
编写一个脚本 word_freq.py,从 sys.stdin 读取文本,统计每个单词的出现频率,并按频率从高到低输出前10个单词。
练习2
编写一个脚本,使用 sys.stdin.isatty() 判断当前是交互模式还是管道模式,交互模式下提示用户输入,管道模式下直接读取数据。
练习3
编写一个简单的行号添加工具,从 sys.stdin 读取内容,为每一行添加行号前缀后输出,格式为 行号: 内容。
常见问题
sys.stdin 和 input() 有什么区别?
input() 是内置函数,自动去除末尾换行符并支持提示信息参数;sys.stdin 是文件对象,保留换行符,需要手动处理,但更适合管道和批量数据处理。
如何判断程序是否在交互模式下运行?
使用 sys.stdin.isatty(),如果返回 True 表示连接到终端(交互模式),返回 False 表示被重定向或管道输入。
如何处理管道输入的 EOF?
在 Unix/Linux 上使用 Ctrl+D,在 Windows 上使用 Ctrl+Z 发送 EOF 信号。使用 for line in sys.stdin 迭代时会自动在 EOF 时结束循环。
sys.stdin.read() 和 sys.stdin.readlines() 哪个更高效?
对于大文件,推荐使用 for line in sys.stdin 迭代方式,因为它逐行读取,内存占用最小。read() 和 readlines() 会一次性加载全部内容到内存。
本文涉及AI创作
内容由AI创作,请仔细甄别