Python输入读取stdin与input

图

 Python中常用到的两种标准化输入方式:分别sys.stdin和input,两者使用方式大致相同,但是总的来说sys.stdin使用方式更加多样化一些,下面就例子说明两者之间的使用差别

input/raw_input 输入

input输入很简单,就是获得用户的输入,一般是在控制台界面

1
2
word=input('please input one or more word\n')
print (word)

运行之后就可以等待用户输入了,最终系统会认为回车键是输入的结束,接下来对输入做任何处理就是你自己的事情啦。

sys.stdin 输入

第一他也可以实现和input一样的功能,比如

1
2
3
4
import sys
print('please input one or more word\n')
word=sys.stdin.readline()
print (word)

但是,他更常见的是另外一种使用方式,可以直接使用文件作为整体的输入,可以很简洁。

1
2
3
4
import sys
print('please input one or more word\n')
word=sys.stdin.readline()
print (word)

使用方法,将文件重定向到输入中去就可以很方便的使用。
控制台中,比如:

1
$ python test.py < test.txt


关于raw_input( )和sys.stdin.readline( )的区别

之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:

1
2
3
4
5
6
import sys

line = sys.stdin.readline()

for i in range(len(line)):
print line[i]+'hello'

它的运行结果让我百思不得其解:

1
2
3
4
5
6
7
123
1hello
2hello
3hello

hello
请按任意键继续。。。

 怎么会多输出一个空行和hello?然后特意输出了line的长度,发现是4,然后重新调试了几次,发现无论输入什么,len(line)的长度总比输入的长度大1,然后用raw_input( )试着运行了一下,运行是正常的,然后查阅了一下文档,发现sys.stdin.readline( )会将标准输入全部获取,包括末尾的’\n’,因此用len计算长度时是把换行符’\n’算进去了的,但是raw_input( )获取输入时返回的结果是不包含末尾的换行符’\n’的

因此如果在平时使用sys.stdin.readline( )获取输入的话,不要忘了去掉末尾的换行符,可以用strip( )函数去掉 sys.stdin.readline( ).strip('\n'),这样处理一下就行了。


其他等价写法

print 'hello' 等价于 sys.stdout.write('hello' + '\n') 输出并且显示,末尾有换行

raw_input 与 sys.stdin()

s = raw_input('请输入:') 等价于 print('请输入:') (可用上式替换)

s = sys.stdin.readline()值得注意的是:
在输入的后面可用split分割输入的字符串使之成为一个列表。例:s = sys.stdin.readline().split()
在输入的后面还可用 strip 去掉末尾空格。

Python 中 read() 和 readline() readlines() 区别

read():将文件一次全部读取成一个字符串,包括特殊字符,需要较大内存

readline():将文件根据换行符一行一行读取

readlines():将文件一次性读取到内存,依行为单位读取为一个列表对象

上述主要是进行标准化输入与获取,这一部分要和参数传递分清楚,其实Python最常用的就是参数传递也就是argpares模块sys模块


题目oj平台实例:

案例一:

输入描述:
第一行有三个整数N, M, K
接下来N行,每行M个整数为输入的矩阵

获取输入实现: 利用stdin

1
2
3
4
5
6
7
import sys
list_num = sys.stdin.readline().split() #读取第一行,分割,即[ 'N', 'M', 'K' ]
N,M,K = [int(list_num[i]) for i in range(len(list_num))] #对字符列表 int() 类型转化,得到 int
... ...
for i in range(N):
line = sys.stdin.readline() #依次遍历所有行,每行存入变量line进行处理
... ...

案例二:

输入描述:
第一行一个整数N,表示数组长度
第二行N个整数,分别表示数组内的元素

获取输入实现: 利用input

1
2
length = int(input())    # 读取第一行 ['N'], int()转换得到 N
arr = list(map(int, input().split())) # 读取第二行,map()操作每个元素int()转换,得到 int列表

案例三:

输入描述:
第一行有两个整数n, k
接下来一行有n个整数表示数组内的元素

获取输入实现:

1
2
length, target = map(int, input().split())
arr = list(map(int, input().split()))

案例四:

输入描述:
第一行输入一个整数N,表示对栈进行的操作总数。

下面N行每行输入一个字符串S,表示操作的种类。
如果S为”push”,则后面还有一个整数X表示向栈里压入整数X。
如果S为”pop”,则表示弹出栈顶操作。
如果S为”getMin”,则表示询问当前栈中的最小元素是多少。

获取输入实现:

1
2
3
4
5
6
7
8
9
10
# N = int(input())    也可以
N = int(sys.stdin.readline().strip()) #这里的去空格 都是保险操作,没有也行
for i in range(N):
#command = sys.stdin.readline().split() 不用去空格也行
command = sys.stdin.readline().strip()
command = command.split() # 每个command即 ["push/pop/getMin", "num"]

command[0] == "push/pop/getMin"
(int)command[1] == num
... ...

坚持原创分享,您的支持将鼓励我继续创作!