浅谈python中sys.stdin.read()方法终端的读取

事情的起因是这样的,博主在刷洛谷的题目时,先是让GPT生成了一段代码,然后有一个很强大的方法sys.stdin.read().splitlines(),然后输入时候迟迟等不到输出,WHY?


1. sys.stdin.read()方法

sys.stdin.read() 是 Python 标准库中的一个函数,用于从标准输入(stdin)中读取所有数据。当你需要处理批量输入或多行输入时,这个函数会非常有用。下面我将详细解释这个函数的作用、使用场景及其工作原理。

1.1 功能介绍

sys.stdin.read() 主要用于从标准输入流中读取数据,直到遇到 EOF(End of File,文件结束符)。

  • 返回值:这个函数返回一个字符串,包含了标准输入中的所有数据。
  • 适用场景:适合于需要一次性读取大量数据的情况,例如从文件重定向输入,或在交互式会话中批量输入数据。
  • 1.2 使用方法

    通常需要导入 sys 模块才能使用这个函数:

    import sys
    
    data = sys.stdin.read()
    print(data)
    

    1.3 读取输入的方式

    使用 sys.stdin.read() 的时候,通常是在命令行或终端中输入数据,或者利用输入重定向从文件中读取。例如,你可以在终端中通过如下命令运行脚本:

    python your_script.py < input.txt
    

    在这个示例中,input.txt 文件的内容会被当作标准输入提供给脚本,sys.stdin.read() 会读取到整个文件内容。

    1.4 特点与注意事项

  • 读取全部数据:与 input() 不同,后者每次只读取一行,sys.stdin.read() 会一次性读取所有输入,可能会导致内存占用较大,特别是在处理非常大的输入时。

  • 没有输入时阻塞:如果没有提供输入,程序会在 sys.stdin.read() 的地方阻塞,等待读取到输入结束(例如 CTRL+D 或 CTRL+Z)。

  • 适合批量处理:这个方法非常适合需要处理多行文本、配置文件或数据文件时使用,可以有效减少逐行读取时的代码复杂性。

  • 1.5 示例代码

    这里是一个使用 sys.stdin.read() 的简单示例,演示如何读取并处理输入数据:

    import sys
    
    def main():
        # 读入所有标准输入数据
        data = sys.stdin.read()
        
        # 拆分成行
        lines = data.splitlines()  # 按行分割
        
        # 输出读取到的每一行
        for line in lines:
            print(f"Line: {line}")
    
    if __name__ == "__main__":
        main()
    

    假设你在终端中运行该程序并输入了多行内容,最后按 CTRL+D(Linux/Mac)或 CTRL+Z(Windows)结束输入,这段代码将输出每一行的内容

    总结

    sys.stdin.read() 是一个强大的工具,用于从标准输入流集中读取数据。它适合处理批量输入数据的场景,也非常适合在命令行中运行脚本时使用。了解它的性能和使用场景将帮助你更好地处理输入数据。


    2. splitlines()方法

    splitlines() 是 Python 字符串方法之一,用于将字符串根据行分割成多个子字符串。它会返回一个列表,其中每个元素都是原字符串的一行。这个方法常用于处理多行文本,特别是在读取文件或其他输入时。

    splitlines() 方法的基本用法
    语法:

    str.splitlines(keepends=False) 
    
  • keepends(可选): 如果为 True,那么行结束符会被保留在返回的列表中;如果为 False(默认值),则不保留行结束符。
  • 示例代码:
  • text = "Hello\nWorld\nThis is Python."  
    lines = text.splitlines()  
    print(lines)  # 输出: ['Hello', 'World', 'This is Python.']  
    

    3. 原因剖析&解决方案

    在 VS Code 中使用 sys.stdin.read() 如果输入不结束,确实会导致程序一直等待输入。这是因为 sys.stdin.read() 方法会读取所有的输入,直到== EOF(End of File)信号。不同操作系统使用的 EOF 信号也不同==

    在 VS Code 中表示输入结束的方法

    1. Windows 系统:

    2. 在 Windows 中,你可以通过按 CTRL + Z 然后按 Enter 来表示输入结束
    3. Linux 和 macOS 系统:

    4. 在 Linux 和 macOS 中,可以通过按 CTRL + D 来表示输入结束。

    使用文件作为输入

    为了更方便地处理输入,特别是进行多行输入测试,通常建议将输入数据放在一个文本文件中,然后通过终端重定向来运行你的 Python 脚本。这样无需手动输入,也不需要关心如何结束输入。

    示例步骤:

    1. 创建一个输入文件:

    2. 创建一个名为 input.txt 的文本文件,填写你需要的输入内容,例如:
      2 3
      1 1 1 5
      1 1 2 10
      1 1 1 0
      2 1 1
      2 1 2
      
    3. 在终端中运行脚本:

    4. 打开终端(Terminal),然后使用以下命令运行你的 Python 文件,使用 < 来重定向输入:
      python your_script.py < input.txt
      
    5. 查看输出:

    6. 运行上述命令后,脚本会从 input.txt 文件中读取输入并执行,而无需在终端中手动输入。

    处理标准输入的示例代码

    假设你的脚本内容如下:

    import sys
    
    def main():
        data = sys.stdin.read()
        lines = data.splitlines()
        
        for line in lines:
            print(f"Received line: {line}")
    
    if __name__ == "__main__":
        main()
    

    这样,当你使用文件重定向运行脚本时,输出会直接来自于 input.txt 中的数据。

    总结

  • 使用 CTRL + ZCTRL + D 来表示结束输入(视操作系统而定)。
  • 更方便的方式是使用文件重定向,这样可以避免手动输入的繁琐。
  • 提前准备好需要的输入数据,并将其保存在一个文件中,是进行程序测试的良好实践。

  • 4. 效果

    作者:石迹耿千秋

    物联沃分享整理
    物联沃-IOTWORD物联网 » 浅谈python中sys.stdin.read()方法终端的读取

    发表回复