添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

sys.stdin读什么?

29 人关注

我知道如何打开文件,然后用Python预先建立的函数来处理它们。但是 sys.stdin 是如何工作的呢?

for something in sys.stdin:
    some stuff here
lines = sys.stdin.readlines()

上述两种对sys.stdin的不同用法有什么区别?它是从哪里读取信息的?是通过键盘,还是仍然要提供一个文件?

1 个评论
你对 input() 熟悉吗?无论 input() 从哪里获得输入,那就是 sys.stdin 。这可能是一个终端,也可能来自一个文件,也可能来自另一个程序的输出,也可能是其他东西,这取决于你如何调用这个程序。
python
file
stdin
sys
Vimzy
Vimzy
发布于 2015-04-05
6 个回答
cdarke
cdarke
发布于 2021-11-10
已采纳
0 人赞同

所以你使用了Python的 "预建函数",大概是这样的。

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

这是通过调用一个迭代器在文件对象上,刚好返回文件的下一行。

你可以改用。

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)。 文件描述符/句柄0默认连接到控制台或tty,所以实际上它是从键盘上读取。 然而,它可以是redirected,通常由一个shell(如bash或cmd.exe)使用这样的语法。

myprog.py < input_file.txt 

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

在python 3中,一个文本流。
Burhan Khalid
Burhan Khalid
发布于 2021-11-10
0 人赞同

它是在阅读 标准输入 - 而它应该由键盘以流数据的形式提供。

不需要提供一个文件,但是你可以使用 redirection to use a file as 标准输入.

在Python中, readlines() 方法读作 全流 ,然后将其分割在 换行符 并创建一个每行的列表。

lines = sys.stdin.readlines()

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

你可以在以下网站阅读更多有关信息输入和输出部分的Python教程。

如果你想提示用户输入,使用input()方法(in Python 2, use raw_input()):

user_input = input('Please enter something: ')
print('You entered: {}'.format(user_input))
    
那么,当我使用sys.stdin.readlines()而不是sys.stdin时,标准输入的读取方式有什么不同呢? 第二个是否能到达每个字?我还是很迷惑。
Andrushenko Alexander
Andrushenko Alexander
发布于 2021-11-10
0 人赞同

要掌握sys.stdin的工作原理,请做以下工作。

创建一个简单的python脚本,我们把它命名为 "readStdin.py"。

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

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

echo "line1 line2 line3" | python readStdin.py

The script outputs:

['"line1 line2 line3" \n']

所以,脚本已经将输入的内容读入列表(名为'lines'),包括由'echo'产生的新行字符。就是说。

Mr. Suryaa Jha
Mr. Suryaa Jha
发布于 2021-11-10
0 人赞同

据我所知,sys.stdin.read()方法接受用户输入的一行,直到一个特殊的字符,如回车键和后面的Ctrl + D,然后将输入的内容存储为字符串。

控制+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一次或两次,你就会看到两个输入的总和。

After finishing with text input, press Enter and then Ctrl+Z --> on Windows
Anthony Kong
Anthony Kong
发布于 2021-11-10
0 人赞同
for something in sys.stdin:
    some stuff here

上面的代码不能像你期望的那样工作,因为sys.stdin是一个文件句柄--它是一个指向stdin的文件句柄。它将不会到达some stuff here

lines = sys.stdin.readlines()

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

那么,当我使用sys.stdin.readlines()而不是sys.stdin时,标准输入的读取方式有什么不同? 第二个是否能达到每个字?我还是很迷惑。
Yimin
Yimin
发布于 2021-11-10
0 人赞同

它将逐行读取源文件。它被广泛用于在线法官系统。

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

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

逐行读取文件是指读取数字2(本例中只有一行)。使用带子来删除不需要的空格或其他指定的字符。这将导致n=(整数)2