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),支持以下常用方法:

方法 参数 说明
read() size=-1 读取指定字符数,默认读取全部内容
readline() size=-1 读取一行,包含末尾换行符
readlines() hint=-1 读取所有行并返回列表
__iter__() 支持迭代,逐行返回内容
close() 关闭标准输入流
fileno() 返回文件描述符(通常为0)
isatty() 判断是否连接到终端

代码示例

示例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

  • 交互式命令行工具:构建需要用户实时输入的交互程序,如配置向导、数据库客户端

  • 批量数据导入:从重定向的文件中读取大量数据进行批量处理


注意事项

注意1sys.stdin.readline() 保留末尾的换行符 \n,通常需要使用 .strip() 去除。

注意2:当标准输入被重定向为文件时,sys.stdin.isatty() 返回 False,可以利用这个特性判断程序是否在交互模式下运行。

注意3sys.stdin.read() 在管道模式下会阻塞直到收到 EOF 信号(Ctrl+D 或 Ctrl+Z),在交互模式下需要手动发送 EOF。

提示:对于简单的用户输入,推荐使用 input() 函数,它内置了提示信息功能和换行处理,更加方便。sys.stdin 更适合处理管道输入和大量数据的场景。


相关方法对比

特性 sys.stdin input() fileinput模块
默认来源 标准输入流 标准输入流 命令行参数文件或标准输入
换行处理 保留换行符 自动去除换行符 保留换行符
提示信息 需手动输出 内置prompt参数
管道支持 原生支持 支持 原生支持
文件列表 不支持 不支持 支持
适用场景 管道/重定向 交互式输入 多文件逐行处理

小结

  • 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() 会一次性加载全部内容到内存。

标签: sys.stdin 标准输入 管道处理 命令行交互 文件对象

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python sys.path详解 - 模块搜索路径管理入门指南 下一篇: sys.stdout与stderr详解 - Python标准输出与错误流控制实战

poll相关推荐