【问题标题】:What does sys.stdin read?sys.stdin 读什么?
【发布时间】:2015-06-09 20:27:49
【问题描述】:

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

for something in sys.stdin:
    some stuff here

lines = sys.stdin.readlines()

以上两种在 sys.stdin 上的不同用途有什么区别?它从哪里读取信息?是通过键盘还是我们还需要提供文件?

【问题讨论】:

  • 你熟悉input()吗?无论input() 从哪里获取输入,那就是sys.stdin。这可能是一个终端,或者它可能是从一个文件定向的,或者它可能来自另一个程序的输出,或者它可能是其他东西,这取决于您调用程序的方式。

标签: python file stdin sys


【解决方案1】:

它将逐行读取源文件。广泛应用于在线裁判系统中。

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

import sys

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

逐行读取文件意味着读取数字2(在这种情况下只有一行)。使用条删除不需要的空格或其他指定字符。这将导致 n = (integer) 2

如果我们有一个包含两行的文件,例如:

1
2

然后,sys.stdin.readline().strip() 会将其转换为包含两个元素 12 的一行(列表,名为 n)。那么我们现在不能使用int转换器,但是我们可以使用int(n[0])int(n[1])来代替。

【讨论】:

  • 我不明白您所说的“将其转换为一行(一个列表,名为 n”).readline() 返回一个字符串,.strip() 将其保留为字符串,您的意思是.split() 或者可能只是 stdin.readlines()
【解决方案2】:

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

【讨论】:

  • 在完成文本输入后,按 Enter 键,然后按 Ctrl+Z --> 在 Windows 上
【解决方案3】:

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

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

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

现在打开控制台任意输入:

echo "line1 line2 line3" | python readStdin.py

脚本输出:

['"line1 line2 line3" \n']

因此,脚本已将输入读入列表(名为“行”),包括“回声”产生的换行符。就是这样。

【讨论】:

    【解决方案4】:

    所以你使用了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)。

    【讨论】:

    • 在python 3中,一个文本流。
    【解决方案5】:

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

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

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

    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))
    

    【讨论】:

    • 那么,当我使用 sys.stdin.readlines() 而不是 sys.stdin 时,标准输入的读取方式有何不同?第二个是否到达每个单词?我还是一头雾水。
    【解决方案6】:
    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 时,标准输入的读取方式有何不同?第二个是否到达每个单词?我还是一头雾水。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多