編輯: 最後我找了解決方案,我是的「重複」的問題,並起草下面的代碼片段:Python的類似scanf輸入
import sys
from collections import deque
_input=deque([])
def read_word():
global _input
while len(_input)==0:
line=sys.stdin.readline().split()
for word in line:
_input.append(word)
return _input.popleft()
def read_int():
return int(read_word())
原題:
我想寫一些讀取Python中stdin輸入的程序。但輸入處理正在讓我失望 - 我沒有看到一種很好的方式來掃描線條中不完美的數據。 例如,如果我必須掃描的整數N,然後N個字要處理,在C++中我會做這樣的:
int N;
char str[100];
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%s",str);
//do stuff with str
}
這一方案將掃描所有的以下輸入的完全相同的方式:
//input 1:
3 word1 word2 word3
//input 2:
3
word1 word2 word3
//input 3:
3
word1
word2
word3
//input 4:
3 word1 word2
word3
我喜歡C類scanf給我的靈活性,我也希望在Python中看到類似的東西。我不能使用input(),因爲它會嘗試將字符串解析爲Python語法(可能以字典或類似的方式結束),而raw_input()則以換行符結尾的行進行操作。函數sys.stdin.read()也不好,因爲它會一直等待,直到給出整個輸入(並且我可能想要實時顯示部分結果)。我看到實現這種功能的唯一方法是在循環中使用sys.stdin.readline(),試圖獨立解析每一行,直到解析所有需要的單詞。但這不是一個很好的解決方案,它也有一些缺陷 - 例如,如果上面提到的示例程序在其進一步操作中應該輸入一個更多的東西,並且這個詞或數字與最後一個詞在同一行中給出, Python程序不會正確解析它。
有問題的投入將是:
//input 5:
3 word1 word2
word3 next_input
單詞「next_input」將被「吞噬」通過的ReadLine()函數,即使它可能是由程序以後需要。同樣,這可以通過提供input_yet_to_be_parsed_but_already_inputted的臨時緩衝區來解決,但它很快會變成非常有問題的代碼。有沒有真正的「pythonic」方式來做到這一點?還是我錯過了明顯的東西?
「在C++中我會做這樣的」 - 這不是C++ ...這是C. – user530873
OK,但在C++中有'CIN >> A >> B;'語法,無論如何,它掃描只是一次一個字,所以問題保持有效。 – akrasuski1