我知道如何打开文件,并使用Python的预定义函数进行操作。但sys.stdin是如何工作的?
for something in sys.stdin:
some stuff here
lines = sys.stdin.readlines()
以上两个不同的sys.stdin用法有什么区别?它读取信息的位置在哪里?是通过键盘还是我们仍然需要提供一个文件?
那么你已经使用了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默认连接到控制台或tty,因此实际上它正在从键盘读取。然而,它可以通过类似这样的语法进行重定向,通常由shell(如bash或cmd.exe)执行:
myprog.py < input_file.txt
这会改变文件描述符0的行为,使其读取一个文件而不是键盘输入。在UNIX或Linux系统中,这可以使用底层调用dup2()
实现。有关重定向的更多信息,请阅读您的shell文档(或者如果您足够勇敢,可以查看man dup2
)。
readlines()
方法读取整个流,然后在换行符处拆分它,并创建每行的列表。lines = sys.stdin.readlines()
input()
方法(在Python 2中,请使用raw_input()
):user_input = input('Please enter something: ')
print('You entered: {}'.format(user_input))
import sys
lines = sys.stdin.readlines()
print (lines)
现在打开控制台,并输入以下内容:
echo "line1 line2 line3" | python readStdin.py
['"line1 line2 line3" \n']
因此,脚本已将输入读入列表中(名为“lines”),包括由“echo”生成的换行符。就是这样。
据我所知,sys.stdin.read() 方法接受用户的输入行,直到遇到特殊字符,如回车键,并接着 Ctrl + D,然后将输入存储为字符串。
Ctrl + 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,即可得到这两个数字的和。
for something in sys.stdin:
some stuff here
上面的代码不能像您期望的那样工作,因为sys.stdin
是一个文件句柄 - 它是指向stdin
的文件句柄。它将不会到达some stuff here
这一行。
lines = sys.stdin.readlines()
它将逐行读取源文件。它在在线评测系统中被广泛使用。
例如:假设我们只有一个数字2
将在文件中使用。
import sys
if __name__ == "__main__":
n = int(sys.stdin.readline().strip())
逐行读取文件意味着只读取数字 2
(在此情况下仅有一行)。使用strip函数去除不需要的空格或其他指定字符。这将导致n = (整数)2
。
如果我们有一个包含两行的文件:
1
2
那么,sys.stdin.readline().strip()
会将其转换为一行(一个名为n
的列表)有两个元素1
、2
。然后我们现在不能使用int
转换器,但我们可以使用int(n[0])
和int(n[1])
代替。
.readline()
返回一个字符串,而.strip()
将其保留为字符串,你是指.split()
或可能只是stdin.readlines()
吗? - Tadhg McDonald-Jensen
input()
吗?无论input()
从哪里获取输入,都是通过sys.stdin
实现的。这可能是终端,也可能是来自文件,或者来自另一个程序的输出,或者取决于你如何调用程序。 - user2357112