2014-10-03 85 views
2

我在指定我需要從STDIN讀取的編碼挑戰中停靠點。這是我的輸入法:python中的stdin和sys.argv有什麼區別?

def __init__(self, input): 
    self._dictionary = {} 
    with open(input, 'r') as f: 
     reader = csv.reader(f, delimiter='\t') 
     for row in reader: 
      if self._dictionary.__contains__(row[0]): 
      self._dictionary[row[0]].append(row[1]) 
      else: 
      self._dictionary.update({row[0]: row[1].split()}) 

,並在腳本

if __name__ == "__main__": 
    script = Script(sys.argv[1]) 
    for line in script.output_method(): 
     print line 

結束是我錯了在要求從標準輸入讀取一個挑戰使用sys.argv中?有什麼不同?我應該做些什麼來滿足要求?

+2

'STDIN' - 從哪裏你將爲你的程序輸入(測試用例)。 'sys.argv' - 運行時提供給程序的參數。 – 2014-10-03 04:02:46

+0

是的,我明白了。但是,上述腳本不符合「腳本必須從STDIN讀取」? – BarFooBar 2014-10-03 04:03:35

+1

檢查了這一點:http://stackoverflow.com/questions/1450393/how-do-you-read-from-stdin-in-python那裏有多個答案在stdin下 – user3885927 2014-10-03 04:09:22

回答

5

他們是不一樣的:

>>> import sys 
>>> sys.argv == sys.stdin 
False 

sys.argv中

  • 傳遞給一個Python腳本命令行參數的清單。

sys.stdin sys.stdout的 sys.stderr對應於解釋器的標準輸入,輸出和錯誤流

  • File對象。 stdin用於除腳本之外的所有解釋器輸入,但包括對input()和raw_input()的調用。

由於@Vivek拉伊在評論中提到的,你可以使用sys.stdin.readlines()從標準的閱讀。此外,fileinput,是提供給您,這似乎做的正是你想要的。

import fileinput 
for line in fileinput.input(): 
    process(line) 

此迭代中sys.argv中列出的所有文件的行[1:], 默認爲sys.stdin如果列表是空的。如果文件名是' - ',那麼 也會被sys.stdin取代。要指定 文件名的替代列表,請將其作爲input()的第一個參數傳遞。單個文件 名稱也是允許的。

+0

我應該做些什麼來滿足要求? – BarFooBar 2014-10-03 04:09:25

+0

@BarFooBar:你應該從'stdin'而不是從用戶指定的文件中讀取數據。 – jwodder 2014-10-03 04:10:29

+1

@BFFooBar簡單地說,'sys.stdin.readlines()'讀取輸入中的所有行。 – 2014-10-03 04:13:55