sys.stdin读什么?

时间:2015-04-05 05:20:05

标签: python file stdin sys

我了解如何打开文件,然后使用Python预先构建的函数。但是sys.stdin是如何工作的?

for something in sys.stdin:
    some stuff here

lines = sys.stdin.readlines()

sys.stdin上面两种不同用法的区别是什么?从哪里读取信息?是通过键盘,还是我们还要提供文件?

5 个答案:

答案 0 :(得分:9)

所以你已经使用了Python"预先构建的函数",大概是这样的:

file_object = open('filename')
for something in file_object:
    some stuff here

这通过在文件对象上调用 iterator 来读取文件,该文件对象恰好返回文件中的下一行。

您可以改为使用:

file_object = open('filename')
lines = file_object.readlines()

将当前文件位置的行读入列表。

现在,sys.stdin只是另一个文件对象,它恰好在程序启动之前由Python打开。您对该文件对象的处理取决于您,但它与任何其他文件对象没有任何区别,只是您不需要open

for something in sys.stdin:
    some stuff here

将遍历标准输入,直到达到文件结尾。这样:

lines = sys.stdin.readlines()

您的第一个问题是关于使用文件对象的不同方式。

其次,从哪里读?它从文件描述符0(零)读取。在Windows上,它是文件句柄0(零)。文件描述符/句柄0默认连接到控制台或tty,因此它实际上是从键盘读取。但是它可以重定向,通常是shell(比如bash或cmd.exe),使用如下语法:

myprog.py < input_file.txt 

将文件描述符改为零以读取文件而不是键盘。在UNIX或Linux上,它使用基础调用dup2()。阅读您的shell文档以获取有关重定向的更多信息(如果您是勇敢的话,也可以man dup2。)

答案 1 :(得分:3)

它是从标准输入读取 - 它应该由流数据形式的键盘提供。

不需要提供文件,但您可以使用redirection将文件用作标准输入。

在Python中,readlines()方法读取整个流,然后在换行符处将其拆分,并创建每行的列表。< / p>

lines = sys.stdin.readlines()

上面创建了一个名为lines的列表,其中每个元素都是一行(由行尾字符决定)。

您可以在Python教程的input and output section了解更多相关信息。

如果要提示用户输入,请使用input()方法(Python 2中的,使用raw_input() ):

user_input = input('Please enter something: ')
print('You entered: {}'.format(user_input))

答案 2 :(得分:2)

for something in sys.stdin:
    some stuff here

上面的代码无法正常工作,因为sys.stdin是文件句柄 - 它是stdin的文件句柄。它不会到达some stuff here

lines = sys.stdin.readlines()

当上面的脚本在交互式shell中运行时,它将阻止执行,直到用户按下Ctrl-D,这表示输入结束。

答案 3 :(得分:1)

要了解sys.stdin的工作原理,请执行以下操作:

创建一个简单的python脚本,将其命名为“ readStdin.py”:

import sys
lines = sys.stdin.readlines()
print (lines)

现在打开控制台,输入任何类型:

echo "line1 line2 line3" | python readStdin.py

脚本输出:

['"line1 line2 line3" \n']

因此,脚本已将输入读入列表(称为“行”),包括由“ echo”产生的换行符。是的。

答案 4 :(得分:0)

据我说,sys.stdin.read()方法接受一行作为来自用户的输入,直到输入一个特殊字符(如Enter键,然后按Ctrl + D),然后将输入存储为字符串。

Control + D作为停止信号。

示例:

import sys

input = sys.stdin.read()
print(input)
tokens = input.split()
a = int(tokens[0])
b = int(tokens[1])
print(a + b)

运行程序后,输入两个以空格分隔的数字,并在按Control + D一次或两次后,将由两个输入的总和显示。