sys.stdin读什么?

What does sys.stdin read?

我知道如何打开文件,然后使用 Python 的预内置函数。但是 sys.stdin 是如何工作的呢?

for something in sys.stdin:
    some stuff here

lines = sys.stdin.readlines()

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

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

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

在 Python 中,readlines() 方法读取 整个流 ,然后在 换行符 [=] 处将其拆分33=] 并创建每一行的列表。

lines = sys.stdin.readlines()

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

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

如果要提示用户输入,使用input()方法(在Python2中,使用raw_input()):

user_input = input('Please enter something: ')
print('You entered: {}'.format(user_input))
for something in sys.stdin:
    some stuff here

上面的代码没有像您预期的那样工作,因为 sys.stdin 是一个文件句柄 - 它是 stdin 的文件句柄。它不会到达 some stuff here

lines = sys.stdin.readlines()

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

所以你用过Python的"pre built in functions",大概是这样的:

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

这通过在文件对象上调用 迭代器 来读取文件,该文件对象恰好 return 文件的下一行。

您可以改用:

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(零)。文件 descriptor/handle 0 默认连接到控制台或 tty,因此实际上它是从键盘读取。然而,它可以被 重定向 ,通常由 shell(如 bash 或 cmd.exe)使用如下语法:

myprog.py < input_file.txt 

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

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

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

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

现在打开控制台任意输入:

echo "line1 line2 line3" | python readStdin.py

脚本输出:

['"line1 line2 line3" \n']

因此,脚本已将输入读入列表(名为 'lines'),包括由 'echo' 生成的换行符。即。

根据我的说法,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)

在 运行 之后,程序输入由 space 分隔的两个数字,完成后按 Control + D 一次或两次,您将看到两个输入的总和。

它将逐行读取源文件。广泛应用于在线裁判系统

例如:假设我们只有一个数字2将在文件中使用。

import sys

if __name__ == "__main__":
    n = int(sys.stdin.readline().strip())

逐行读取文件意味着读取编号2(本例中只有一行)。使用 strip 删除不需要的 space 或其他指定字符。这将导致 n = (integer) 2.

如果我们有一个包含两行的文件:

1
2

然后,sys.stdin.readline().strip() 将其转换为包含两个元素 12 的一行(列表,名为 n)。那么我们现在不能使用 int 转换器,但我们可以使用 int(n[0])int(n[1]) 代替。