2015-04-05 31 views
4

我得到如何打開文件,然後使用Python的預先構建函數與他們。但是sys.stdin如何工作?sys.stdin讀什麼?

for something in sys.stdin: 
    some stuff here 

lines = sys.stdin.readlines() 

sys.stdin上述兩種不同用法有什麼區別?它從哪裏讀取信息?是通過鍵盤嗎,還是我們還要提供一個文件?

+0

你對'input()'熟悉嗎?無論input()從哪裏接受輸入,都是'sys.stdin'。這可能是一個終端,或者它可能來自一個文件,或者它可能來自另一個程序的輸出,或者它可能是別的,這取決於你如何調用程序。 – user2357112 2015-04-05 05:23:42

回答

5

所以,你必須使用Python的「預先內置函數」,大概是這樣的:

file_object = open('filename') 
for something in file_object: 
    some stuff here 

這樣通過這恰好返回從下一行的文件對象上調用迭代讀取文件文件。

你也可以使用:

file_object = open('filename') 
lines = file_object.readlines() 

讀取從當前文件位置的行成一個列表。

現在,sys.stdin只是另一個文件對象,恰好在您的程序啓動之前由Python打開。你對該文件對象的處理由你決定,但它與任何其他文件對象沒有任何區別,只是你不需要open

for something in sys.stdin: 
    some stuff here 

將迭代通過標準輸入,直到達到文件結束。如此:

lines = sys.stdin.readlines() 

你的第一個問題實際上是關於使用文件對象的不同方式。

二,它從哪裏讀取?它從文件描述符0(零)讀取。在Windows上,它是文件句柄0(零)。文件描述符/句柄0默認連接到控制檯或tty,因此它實際上是從鍵盤讀取的。但是它可以使用語法類似這樣的重定向,通常由殼(如bash或CMD.EXE):

myprog.py < input_file.txt 

能改變文件描述符零讀取文件而不是鍵盤。在UNIX或Linux上,它使用底層調用dup2()。閱讀您的shell文檔以獲取有關重定向的更多信息(如果您很勇敢的話,也許是man dup2)。

3

它從標準輸入讀取 - 它應該由鍵盤以流數據的形式提供。

不需要提供文件,但是您可以使用redirection將文件用作標準輸入。

在Python中,readlines()方法讀取整個流,然後在換行符分裂起來並創建每一行的列表。

lines = sys.stdin.readlines() 

上面創建了一個名爲lines的列表,其中每個元素將是一行(由行尾字符確定)。

您可以在Python教程的input and output section上閱讀更多信息。

如果您想提示用戶進行輸入,使用input()方法(在Python 2 ,使用raw_input()):

user_input = input('Please enter something: ') 
print('You entered: {}'.format(user_input)) 
+0

那麼當我使用sys.stdin.readlines()而不是sys.stdin時,標準輸入的讀取方式是不同的?第二個輸入是否到達每個單詞?我仍然困惑。 – Vimzy 2015-04-05 05:25:46

2
for something in sys.stdin: 
    some stuff here 

如您所願,因爲sys.stdin上面的代碼不起作用是一個文件句柄 - 它是stdin的文件句柄。它不會到達some stuff here

lines = sys.stdin.readlines() 

當上述在交互式shell運行腳本,它將直到用戶按下CTRL-d,其指示輸入結束塊的執行。

+0

那麼,當我使用sys.stdin.readlines()而不是sys.stdin時,標準輸入的讀取方式會有所不同嗎?第二個輸入是否到達每個單詞?我仍然困惑。 – Vimzy 2015-04-05 05:31:50