2017-12-18 188 views
-1

program1.py:为什么stdin是一行一行地阅读,而不是像字符串一样一字一句地阅读?

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:

这是一个测试
个与多行
只是一样的第二个例子
但具有更多的单词

为什么程序1和程序2两个输出在一个单独的行中的字符串中的每个字符,但如果我们运行cat infile.txt | python3 program3.py,它输出一行一行的文字?

+2

因为'sys.stdin'不是一个字符串 - 它是构造成逐行读取的特殊类。 – furas

+1

'sys.stdin' *不是'str' *对象,它是一个文件对象。 –

回答

1

说明sys.stdin,从蟒docs:对应于该解释器的标准输入,输出和错误流

File对象。

所以sys.stdin是一个文件对象,而不是一个字符串。要了解有关文件对象的迭代器的工作,看看,再一次,蟒蛇docs

当一个文件被用作迭代,通常在for循环中(例如,在F线:打印line.strip()),next()方法被重复调用。这个方法返回下一个输入行,或者当打开文件时读取EOF时触发ECI(当文件打开写入时行为不确定)

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

-2

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

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

'sys.stdin'不存储数据拆分成行。这与存储细节无关。 – user2357112

+0

我知道什么是我写的stdin,以解释标准输入是如何工作的... –

2

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

+0

你可以改变它; https://stackoverflow.com/questions/25611796/how-to-read-in-one-character-at-a-time-from-a-file-in-python – tripleee

相关问题