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

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

文章目录

  • Python中sys.stdin.readline()与input()的区别
    • 1.概念上的区别
    • 2.使用上的区别
      • 2.1异常处理
      • 2.2可重定向输入
      • 2.3迭代读取
      • 2.4灵活性
      • 2.5两种循环读取方式

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 sysline: str = sys.stdin.readline()
print(line)

在shell中输入

Hello
Hello# 这里打印的时候自动打印了\n换行符
import sysline: str = sys.stdin.readline().strip()		# 去掉换行符\n
print(line)
Hello World
Hello World			# 去掉了换行符\n

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

import sysline: 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
HelloPlease Enter Something:^Z
Reach the End of File.

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

import syswhile True:letters = sys.stdin.readline().lower().strip()if letters == "":breakprint(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 sysfor 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 sysfor 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() == "":breakprint(line)

当输入空字符的时候停止

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

更安全的C gets()和str* 以及fgets和strcspn的用法

#include <stdio.h>int main() {char *str;gets(str);puts(str);return(0); }可以说全是错误 首先char *str没有指向一个分配好的地址&#xff0c;就直接读入&#xff0c;危险 ps: 怎么理解char *str "Hello World" 是将一个存储在一个只读的数据段中字符串常…

c语言:一元二次方程(可能有复根)

一元二次方程&#xff08;可能有复根&#xff09; 任务描述 输入三个系数&#xff0c;求一元二次方程的解,要求输出所有可能的情况,包括复根。 输入格式: 三个实数a,b,c 输出格式: 按输出样例格式输出&#xff0c;注意输出顺序。 输入示例1 1 6 9输出示例1 x1x2-3.00000…

AI预测-一文解析AI预测数据工程

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

《操作系统实践-基于Linux应用与内核编程》第10章-Linux综合应用

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容&#xff0c;所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者&#xff1a;房胜、李旭健、黄…

复现文件上传漏洞

一、搭建upload-labs环境 将下载好的upload-labs的压缩包&#xff0c;将此压缩包解压到WWW中&#xff0c;并将名称修改为upload&#xff0c;同时也要在upload文件中建立一个upload的文件。 然后在浏览器网址栏输入&#xff1a;127.0.0.1/upload进入靶场。 第一关 选择上传文件…

数字孪生-使用Unity构建能实时显示应力应变的孪生模型

Motivation - 采用Unity作为孪生技术栈的经历? 最开始想要利用Ansys的Twin Builder模块来进行数字孪生的开发&#xff0c;但是Ansys 的Twin Builder在部署的时候&#xff0c;需要license&#xff0c;要获得license所要花费的价格是难以接受的。 后来想要利用QTVTK的方式来进行…

C++/CLI学习笔记3(快速打通c++与c#相互调用的桥梁)

c/cli变量和操作符 3.1:什么是变里 变量是存储数据以便应用程序临时使用的内存位置&#xff0c;具有名称、类型和值。变量值在应用程序执行期间可能改变&#xff0c;变量名也是。变量使用前必须声明&#xff0c;即指定类型和提供名称。变量的类型决定了值的范围以及能执行的操…

MATLAB:拟合与插值

一、关于多项式的基本操作 若要求非线性方程的根&#xff0c;则采用fzero, fminbnd函数 二、多项式拟合 clc, clear x0:0.2:10; y0.25*x20*sin(x); plot(x,y,k.,MarkerSize,15) grid on; hold on [p1,s1,mu1]polyfit(x,y,3); %3阶多项式拟合 y1polyval(p1,x,s1,mu1); [p2,s…

2024.3.17 机器学习周报

引言 Abstract 文献阅读 1、题目 R-TRANSFORMER: RECURRENT NEURAL NETWORK ENHANCED TRANSFORMER 2、引言 递归神经网络长期以来一直是序列建模的主要选择。然而&#xff0c;它严重遭受两个问题&#xff1a;在捕获非常长期的依赖性和无法并行化的顺序计算过程中无能为力…

云服务器2核4G能支持多少人同时访问?拿本记上!

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&#xff0c;经阿腾云测试&a…

[蓝桥杯练习题]确定字符串是否包含唯一字符/确定字符串是否是另一个的排列

确定字符串是否包含唯一字符 #include<bits/stdc.h> using namespace std; int main(){ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);map<char,int>m;string s;cin>>s;for(int i0;i<s.size();i){if(isalpha(s[i]))s[i]tolower(s[i]);if(…

Websocket服务监听收发消息

目录 1.pom依赖坐标2.项目配置端口和项目包名2.创建处理器3.注册处理器4.前端页面 1.pom依赖坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>2.项目配…

如何使用“Docker registry创建本地仓库,在服务器之间进行文件push和pull”?

1.1、在服务器1&#xff0c;运行registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restart always --name registry registry:2.7.11.2、编辑/etc/docker/daemon.json 文件&#xff0c; 192.168.xxx.xxx 换成你自己 registry 服务的地址 sudo na…

印度交易所股票行情数据API接口

1. 历史日线 # Restful API https://tsanghi.com/api/fin/stock/XNSE/daily?token{token}&ticker{ticker}默认返回全部历史数据&#xff0c;也可以使用参数start_date和end_date选择特定时间段。 更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式…

mysql用 法like concat()

对于mysql 的 like 而言&#xff0c;一般都要用 like concat() 组合&#xff0c;可以防止sql注入 所以用未注释掉的呢种方式会比较好&#xff0c;不推荐直接用like的方式 。 like concat(%/,#{datePath,jdbcTypeVARCHAR},/%) concat函数&#xff1a; 第…

下载程序到嵌入式开发板教程

一、设置共享目录 ubuntu与Window共同拥有的目录。 第一步&#xff1a;在Windows下创建一个文件夹share 第二部&#xff1a;点击虚拟机--->设置--->选项--->共享文件夹 进入共享目录的命令&#xff1a;cd/mnt/hgfs/share 二、C语言编译器 使用Linux平台下的gcc编…

MyBatis Plus(代码生成器)

一、安装 安装MyBatisPlus插件 二、配置 1、 在生成代码之前首先需要配置所要连接的数据库 下面所对应的分别是&#xff1a; 所要连接的数据库 数据库驱动 用户名 密码 2、 点击Other->Code Generator 开始配置所需选项

实现加一天的操作

编写一个日期类&#xff0c;要求按xxxx-xx-xx 的格式输出日期&#xff0c;实现加一天的操作。 输入输出格式 输入描述: 输入第一行表示测试用例的个数m&#xff0c;接下来m行每行有3个用空格隔开的整数&#xff0c;分别表示年月日。测试数据不会有闰年。 输出描述: 输出m行。…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十四)-DL-TDOA 定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

基于卷积神经网络实现手写数字识别

基于卷积神经网络实现手写数字识别 基于卷积神经网络实现手写数字识别。具体过程如下&#xff1a; &#xff08;1&#xff09; 定义ConvNet结构类及其前向传播方式 &#xff08;2&#xff09; 设置超参数以及导入相关的包。 &#xff08;3&#xff09; 定义训练网络函数和绘…