浅谈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)
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 中表示输入结束的方法
-
Windows 系统:
- 在 Windows 中,你可以通过按
CTRL + Z
然后按Enter
来表示输入结束 -
Linux 和 macOS 系统:
- 在 Linux 和 macOS 中,可以通过按
CTRL + D
来表示输入结束。
使用文件作为输入
为了更方便地处理输入,特别是进行多行输入测试,通常建议将输入数据放在一个文本文件中,然后通过终端重定向来运行你的 Python 脚本。这样无需手动输入,也不需要关心如何结束输入。
示例步骤:
-
创建一个输入文件:
- 创建一个名为
input.txt
的文本文件,填写你需要的输入内容,例如:2 3 1 1 1 5 1 1 2 10 1 1 1 0 2 1 1 2 1 2
-
在终端中运行脚本:
- 打开终端(Terminal),然后使用以下命令运行你的 Python 文件,使用
<
来重定向输入:python your_script.py < input.txt
-
查看输出:
- 运行上述命令后,脚本会从
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 + Z
或 CTRL + D
来表示结束输入(视操作系统而定)。4. 效果
作者:石迹耿千秋