2017-12-18 189 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

相關問題