Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sys.stdin读什么?_Python_File_Stdin_Sys - Fatal编程技术网

Python sys.stdin读什么?

Python sys.stdin读什么?,python,file,stdin,sys,Python,File,Stdin,Sys,我了解了如何打开文件,然后使用Python的预构建函数。但是sys.stdin是如何工作的呢 for something in sys.stdin: some stuff here lines = sys.stdin.readlines() 在sys.stdin上的上述两种不同用途之间有什么区别?它从哪里读取信息?它是通过键盘,还是我们仍然需要提供一个文件?它是从标准输入中读取的,应该由键盘以流数据的形式提供 不需要提供文件,但是您可以将文件用作标准输入 在Python中,readl

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

for something in sys.stdin:
    some stuff here

lines = sys.stdin.readlines()
在sys.stdin上的上述两种不同用途之间有什么区别?它从哪里读取信息?它是通过键盘,还是我们仍然需要提供一个文件?

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

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

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

lines = sys.stdin.readlines()
上面创建了一个名为lines的列表,其中每个元素都是一行(由行尾字符确定)

您可以在Python教程的末尾阅读更多关于这方面的内容

如果要提示用户输入,请使用
input()
方法(在Python 2中,使用
raw\u input()
):

上面的代码不能像您期望的那样工作,因为
sys.stdin
是一个文件句柄-它是
stdin
的一个文件句柄。它不会到达
此处的某些内容

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

因此您使用了Python的“预构建函数”,大概是这样的:

file_object = open('filename')
for something in file_object:
    some stuff here
myprog.py < input_file.txt 
它通过调用file对象上的迭代器读取文件,迭代器恰好返回文件的下一行

您可以改为使用:

file_object = open('filename')
lines = file_object.readlines()
它将当前文件位置的行读取到列表中

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

for something in sys.stdin:
    some stuff here
将遍历标准输入,直到到达文件末尾。这也将:

lines = sys.stdin.readlines()
您的第一个问题实际上是关于使用文件对象的不同方式

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

file_object = open('filename')
for something in file_object:
    some stuff here
myprog.py < input_file.txt 
myprog.py

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

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

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

现在打开控制台中的任意类型:

echo "line1 line2 line3" | python readStdin.py
脚本输出:

['"line1 line2 line3" \n']

因此,脚本已将输入读入列表(名为“lines”),包括由“echo”生成的新行字符。也就是说。

根据me sys.stdin.read()方法接受一行作为用户输入,直到输入一个特殊字符,如Enter键,后跟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一次或两次,您将看到两个输入的总和。

您熟悉
input()
?无论
input()
从何处获取输入,都是
sys.stdin
。这可能是一个终端,或者它可能是从文件中定向的,或者它可能来自另一个程序的输出,或者它可能是其他东西,这取决于您调用程序的方式。那么,当我使用sys.stdin.readlines()而不是sys.stdin时,标准输入的读取方式有什么不同呢?第二个输入是否到达每个字?我仍然很困惑。那么,当我使用sys.stdin.readlines()而不是sys.stdin时,标准输入的读取方式有什么不同呢?第二个输入是否到达每个单词?我仍然感到困惑。在python 3中,是一种文本流。完成文本输入后,在Windows上按Enter键,然后按Ctrl+Z-->键
import sys

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