【问题标题】:Why does stdin read line by line rather than word by word like a string?为什么标准输入是逐行读取而不是像字符串一样逐字读取?
【发布时间】:2018-05-31 09:31:38
【问题描述】:

program1.py:

a = "this is a test"
for x in a:
    print(x)

program2.py:

a = """this is a test
       with more than one line
       three, to be exact"""
for x in a:
    print(x)

program3.py:

import sys

for x in sys.stdin:
    print(x)

infile.txt:

这是一个测试
多行
和第二个例子一样
但话多了

为什么program1和program2都将字符串中的每个字符都输出在单独的一行,但是如果我们运行cat infile.txt | python3 program3.py,它会逐行输出文本?

【问题讨论】:

  • 因为sys.stdin 不是字符串——它是一个特殊的类,被构造成逐行读取。
  • sys.stdin 不是 str 对象,它是一个文件对象。

标签: python string python-3.x iteration sys


【解决方案1】:

sys.stdin 是一个文件句柄。迭代文件句柄一次生成一行。

【讨论】:

【解决方案2】:

sys.stdin的描述,来自pythondocs

与解释器的标准输入、输出和错误流对应的文件对象。

所以sys.stdin 是一个文件对象,而不是一个字符串。要了解 File 对象的迭代器是如何工作的,请再次查看 python docs

当文件被用作迭代器时,通常在 for 循环中(例如,for line in f: print line.strip()),next() 方法会被重复调用。此方法返回下一个输入行,或在打开文件以供读取时遇到 EOF 时引发 StopIteration(当文件为写入而打开时行为未定义)

因此,迭代器在每次调用时产生下一行输入,而不是在字符串上观察到的逐字符迭代。

【讨论】:

    【解决方案3】:

    因为sys.stdin 中的数据像行数组一样存储,所以当您运行for x in sys.stdin 时,它会逐行而不是字符。要做到这一点,请尝试以下操作:

    for x in sys.stdin:
        for y in x:
            print(y)
        print("")
    

    【讨论】:

    • sys.stdin 不存储拆分为行的数据。这与存储细节无关。
    猜你喜欢
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2010-11-08
    • 2013-10-20
    • 1970-01-01
    相关资源
    最近更新 更多