自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
语法参考
sys.stdin是一个标准化输入对象,可以连续输入或读入文件所有内容,不结束,不能直接使用。输入完成后,再对输入数据进行处理,这是sys.stdin的强大之处。sys.stdin.readline()方法和sys.stdin.readlines()方法是经常用到的方法,sys.stdin.readline()方法输入一行,输完成后自动添加’\n’。sys.stdin.readlines()可以连续输入数据,此时可以将输入的数据作为一个整体进行使用。sys.stdin.readline()的基本用法如下:
sys.stdin.readline()
使用sys.stdin.readline()与input()方法都可以实现标准化输入,但两者有以下区别:
l sys.stdin.readline()方法不能填写提示输入信息的说明文字,但input()方法在括号内可以直接填写输入信息相关的说明文字,如input('请输入您的名字:')。
l sys.stdin.readline()方法会在输入新后加“\n”换行符,而input()方法在输入完成后不会添加任何内容。要想取消sys.stdin.readline()方法添加的换行符“\n”,可以使用strip('\n') 去除换行符。
下面代码获取用户输入内容的长度,可以比较一下sys.stdin.readline()和input()输入内容的区别。代码如下:
import sys
line1 = sys.stdin.readline() # 包含换行符"\n"
line2 = sys.stdin.readline().strip('\n') # 去掉换行符"\n"
line3 = input("") # 不包含换行符"\n"
print(len(line1), len(line2), len(line3))
输出结果如下:
要输入多行数据,使用sys.stdin.readlines()方法是最有效的,该方法可以连续输入多行,输入完成时,需要回车到空行,然后按ctrl+D输出结果。应用参见锦囊2。简单实现多行输入的代码如下:
import sys
message = sys.stdin.readlines()
print(message)
用户连续输入多行信息,如图1所示,输入完成后,回车到空行,然后按ctrl+D输出结果如图2所示:
图1 输入多行数据
图2 输出显示
快用锦囊
锦囊1:常规输入相关内容
sys.stdin.readline()方法不能添加输入提示说明文字,如果要添加提示说明文字,需要使用print()方法进行输入信息提示,代码如下:
import sys
print('请输入您的名字: ')
name = sys.stdin.readline()
print('您输入的名字为: ', name)
程序运行结果如下:
锦囊2:将输入作为整体进行处理
在批量输入数据的时候,经常需要输完数据后在对数据做统一处理,如对数据统一编号、格式处理等,sys.stdin.readlines可以直接将输入的数据作为整体,输入完成后再做数据处理,如将用户输入的姓名前统一加上3位数字编号,输入完成时一定要回车,然后按“ctrl +D”输出程序运行结果。程序代码如下:
import sys
index=0 # 初始化编号
for line in sys.stdin.readlines(): # 按行读取输入的数据
line = line.strip() # 去掉空格和换行符
index=index+1 # 编号递进加1
if line: # 如果行输入不为空
txt=str(index).zfill(3)+" "+ line # 将输入的数据前加上3位编号
print (txt)
运行程序,输入数据,如图3所示,结束输入时需要先回车到空行,然后按“ctrl +D”输出程序运行结果,如图4所示。
锦囊3:根据两点坐标计算直线的斜率
在勘探、地理探测工作中,有时需要根据输入空间的位置计算两点(x1,y1)(x2,y2)形成直线的斜率,斜率的计算公式为:(y2 - y1) / (x2 - x1),下面编写一个程序,根据用户输入的两点坐标计算直线斜率k。代码如下:
import sys
print('请输入两点的4个坐标值,形式为x1 y1 x2 y2,用空格间隔!!')
while True:
line = sys.stdin.readline()
if line == '\n': break
x1, y1, x2, y2 = (float(x) for x in line.split())
k = abs(y2 - y1) / abs(x2 - x1)
print('两点坐标的斜率为:',format(k,'.2f'))
运行程序,输出结果如图5所示。
图5 两点坐标斜率
也可以直接使用sys.stdin对象输入数据,然后循环读取sys.stdin对象的数据。下面使用sys.stdin对象根据两点坐标计算直线的斜率,代码如下:
import sys
print('请输入两点的4个坐标值,形式为x1 y1 x2 y2,用空格间隔!!')
for line in sys.stdin:
if line == '\n': break
x1, y1, x2, y2 = (float(x) for x in line.split())
k = abs(y2 - y1) / abs(x2 - x1)
print( format(k,'.2f'))
锦囊4:利用sys.stdin读取文件信息
sys.stdin是一个普通文件对象,除了从标准输入读取内容以外,也可以使用sys.stdin调用读取文件信息。如读取文件”gjqh.txt”的所有国家区号,然后调用readlines函数将前3位为“* 8”的区号输出出来,实现代码如下:
import sys
fileName='gjqh.txt'
def readfile(file,ord): # 定义查询电话区号的函数readfile
with open(file) as txt: # 将国际区号信息文件赋值给变量txt
sys.stdin = txt # 将变量txt的数据赋值给sys.stdin对象
for line in sys.stdin.readlines(): # 按行读取sys.stdin对象的数据
line=line.strip() # 去除空格
if line [0:3]==ord: # 按每行数据的前3个字符查询
print(line) # 输出查询结果
readfile(fileName,'* 8') # 调用readfile(),查询国际区号前三个字符是 '* 8'的国家或地区
运行程序,输出效果如图6所示。
图6 读取文件