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()
将其转换为包含两个元素 1
、2
的一行(列表,名为 n
)。那么我们现在不能使用 int
转换器,但我们可以使用 int(n[0])
和 int(n[1])
代替。
我知道如何打开文件,然后使用 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()
将其转换为包含两个元素 1
、2
的一行(列表,名为 n
)。那么我们现在不能使用 int
转换器,但我们可以使用 int(n[0])
和 int(n[1])
代替。