Python3:使用input()如何从管道(stdin)读取多行?

时间:2015-08-04 18:05:25

标签: python-3.x input pipe stdin

我在学习python3时很好奇,并没有在网上找到任何好的解释,也不是我的问题。

读取输入()它说"读取stdin"所以我想我可能会尝试并试图用它来读取管道。它确实如此!但只有一行(直到EOL)。所以出现的下一个问题是

如何使用input()?

从pipe(stdin)读取多行

我找到sys.stdin并使用sys.stdin.isatty()来确定stdin是否绑定到tty,假设如果没有绑定到tty,则数据来自管道。所以我也成功地发现并使用了sys.stdin.readlines()来读取多行。

但仅仅是因为我的好奇心,有没有办法通过使用普通的input()函数实现相同的?到目前为止,我还没有找到一些东西"来测试"如果stdin包含更多行而不阻塞我的程序。

抱歉,如果这一切对您没有意义。

这是我的实验代码到目前为止没有输入():

import sys

if sys.stdin.isatty(): # is this a keyboard?
    print(  "\n\nSorry! i only take input from pipe. " 
            "not from a keyboard or tty!\n"
            "for example:\n$ echo 'hello world' | python3 stdin.py"
            ""
            ""
            )
else:
    print ( "reading from stdin via pipe : \n ")

    for line in sys.stdin.readlines():
        print(line, end="")
#   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can these two lines be replaced with 
#   some construction using plain old input() ? 

2 个答案:

答案 0 :(得分:0)

如果您只想使用input()来访问stdin的行:

print(input()) #prints line 1
print(input()) #prints next line

但是可以说您只想访问第二行:

input() #accesses the first line
print(input()) #prints second line

让我们说您想采用第二行并创建一个数组: 标准输入:

10

64630 11735 14216 99233 14470 4978 73429 38120 51135 67060

input()
values = list(map(int, input().split(' ')))

值将等于[64630,11735,14216,99233,14470,4978,73429,38120,51135,67060]

答案 1 :(得分:-1)

您可以像其他任何可迭代对象一样迭代stdin中的行:

for line in sys.stdin:
    # do something

如果您想将整个内容读入一个字符串,请使用:

s = sys.stdin.read()

请注意,迭代s将一次返回一个字符。

请注意it won't read until there is an EOF terminating stdin.