我了解如何打开文件,然后使用Python预先构建的函数。但是sys.stdin是如何工作的?
for something in sys.stdin:
some stuff here
lines = sys.stdin.readlines()
sys.stdin上面两种不同用法的区别是什么?从哪里读取信息?是通过键盘,还是我们还要提供文件?
答案 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一次或两次后,将由两个输入的总和显示。