为什么stdin逐行读取而不是像字符串一样逐字读取?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么stdin逐行读取而不是像字符串一样逐字读取?相关的知识,希望对你有一定的参考价值。

program1.朋友:

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

program2.朋友:

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

program3.朋友:

import sys

for x in sys.stdin:
    print(x)

infile.txt:

这是一个测试 有多条线 和第二个例子一样 但有更多的话

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

答案

来自python sys.stdindocs的描述:

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

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

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

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

另一答案

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

另一答案

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

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

以上是关于为什么stdin逐行读取而不是像字符串一样逐字读取?的主要内容,如果未能解决你的问题,请参考以下文章

Java 学习笔记 - 读写字符文件

如何从文件中逐字读取?

Java 学习笔记 - IO篇:读写文本文件txt

node.jsreadline (逐行读取)

并行读取 STDIN 时 $_ 为空

从文件逐字读取并确定换行 C++