Python中sys.stdin.readline()与input()的区别

Python中sys.stdin.readline()与input()的区别

1.概念上的区别

在 Python 中,input()sys.stdin 是用于读取用户输入的两种常用方式,它们在使用上有一些区别。

调用方式: input() 是一个内置函数,可以直接调用。它会在程序执行时暂停,等待用户在命令行中输入内容,并返回用户输入的字符串。而 sys.stdin 是一个文件对象,需要通过 sys.stdin.readline() 或其他文件读取方法来读取用户输入。

交互性: input() 提供了一种简单的、与用户进行交互的方法。它会在用户输入之后立即返回输入的字符串,并继续执行程序。因此,input() 可以方便地用于逐行交互式输入。而使用 sys.stdin 读取用户输入时,通常需要在代码中设置适当的逻辑来等待用户输入并处理输入数据。

返回值: input() 返回用户输入的内容作为字符串。例如,input_str = input("Enter something: ") 将用户输入的内容赋值给变量 input_str。而 sys.stdin.readline() 返回从标准输入读取的一行内容,包括换行符。你需要使用字符串方法(如 strip())来处理输入并去除换行符。例如:

import sys

line: str = sys.stdin.readline()
print(line)

在shell中输入

Hello
Hello
			# 这里打印的时候自动打印了\n换行符
import sys

line: str = sys.stdin.readline().strip()		# 去掉换行符\n
print(line)
Hello World
Hello World			# 去掉了换行符\n

input输入不会保存换行符\n,例如

import sys

line: str = input("ENTER: ")
print(line)
ENTER: Hello World 
Hello World

适用场景: input() 适用于需要简单的用户交互输入的情况,尤其是逐行输入。它方便、易用,并且适用于大多数情况。sys.stdin 更适合于需要更高级的输入处理,或者需要与其他文件输入/输出操作结合使用的情况。它提供了更多的灵活性和控制权,但需要更多的代码来处理输入和处理错误。

2.使用上的区别

在处理输入和交互的时候,input()sys.stdin在一些方面有更多的区别:

2.1异常处理

input() 在遇到文件结束符(End-of-File,EOF)时(如在命令行中按下 Ctrl+DCtrl+Z),会引发 EOFError 异常。你可以使用 try-except 块来捕获和处理这个异常。例如:

try:
    user_input: str = input("Please Enter Something:")
    print(user_input)
except EOFError:
    print("Reach the End of File.")
Please Enter Something:Hello
Hello

Please Enter Something:^Z
Reach the End of File.

而使用 sys.stdin 读取时,当没有更多的输入可用时,sys.stdin.readline() 会返回一个空字符串。你可以通过检查返回的字符串是否为空来判断是否到达文件末尾。例如:

import sys

while True:
    letters = sys.stdin.readline().lower().strip()
    if letters == "":
        break
    print(letters)

这段代码将我们输入的字符转换成小写的字符,如果输入为空则结束转换。

AdiUJjdads					# 第一次输入
adiujjdads
AAADDDDDDD					# 第二次输入
aaaddddddd
							# 输入空字符,则退出

2.2可重定向输入

使用 sys.stdin 可以轻松地重定向输入源。你可以将输入从文件中读取而不是从标准输入流中读取。例如,在UNIX-like的系统中,可以在命令行中使用 < 运算符将文件内容重定向到标准输入流:python script.py < input.txt。在Windows PowerShell中,可以使用type命令,这样,你的代码可以像读取标准输入一样读取文件内容。而 input() 函数无法直接重定向输入,它仅与标准输入流交互。sys.stdin 默认从标准输入流中读取数据,但你也可以重定向输入源,从文件或其他来源读取数据,默认的输入源是从终端中进行输入。

举个例子,加入你有一个input.txt文件,里面存放了如下的内容

Hello, World!
This is a redirect test.

Python脚本test.py中有如下内容

import sys

for line in sys.stdin:
    print(line.strip())

在Windows Powershell中执行:

PS D:\Files\leetcode> type input.txt | python test.py
Hello, World!
This is a redirect test.

2.3迭代读取

sys.stdin 可以像文件对象一样进行迭代读取。你可以使用 for 循环逐行读取输入,而不需要显式调用 readline() 方法。例如:

import sys

for line in sys.stdin:
    # 处理每一行输入
    print(line)

这种迭代方式对于处理大量输入或逐行处理输入非常有用。而 input() 函数不支持迭代读取,它只能在需要输入时阻塞程序并等待用户输入。

2.4灵活性

sys.stdin 是一个文件对象,你可以使用其他文件处理方法和属性来处理输入。例如,你可以使用 read() 方法一次性读取所有内容,或者使用 seek() 方法在文件中移动读取位置。此外,你还可以使用 isatty() 方法检查输入是否来自终端(tty)。这些方法和属性提供了更多的灵活性和控制权,适用于更复杂的输入处理场景。

2.5两种循环读取方式

使用input()进行循环读取

while True:
    try:
        letters: str = input()
        print(letters)
    except EOFError:
        break

在终端中输入Ctrl+Z停止输入

使用sys.stdin进行循环读取

import sys
for line in sys.stdin:
    if line.strip() == "":
        break
    print(line)

当输入空字符的时候停止

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值