2011-07-26 57 views
1

我試圖在命令提示符下從用戶處獲得輸入。該程序以「cat text.txt | ./thescript.py」的形式從文本文件中讀取數據。raw_input()中的Python EOF錯誤

在所涉腳本的位置,所有數據已被讀入,處理並放入列入清單。

現在我通過列表尋找可疑項目的列表。代碼基本如下所示:

for invoice in parsedlist: 
     if invoice[-1] == 3: 
      sys.stderr.write("triple duplicate at " + invoice[2]+' : ' + invoice[3]+"\n") 
      sys.stderr.write("continue Y or N \n") 
      answer = raw_input("Type your answer here") 
      if answer == 'N': 
       sys.exit(1) 
      else: 
       pass` 

此代碼導致EOFError。從我已經理解,stdin是在這種情況下從貓讀取,因爲它已經達到EOF,這就是爲什麼raw_input獲取EOF在這裏? (我認爲)目標是讓腳本打印標準錯誤警告,並讓我選擇是否忽略警告並繼續或完全退出。最後,所有輸出都會顯示出來,並且不會包含任何錯誤警告或響應。我看過使用try/exception的例子,但在這種情況下我還沒有弄清楚它的意義。 (例如,爲什麼raw_input不會等待輸入?)

我想我可能只是以錯誤的方式攻擊這個問題,從而產生一個問題,可能會更好地走過去,然後跳過。任何幫助一如既往地受到讚賞。

+0

對不起,縮進。他們是在原來的。 – Wyatt

+1

'cat text.txt | 。/ thescript.py'通常拼寫爲'./thescript.py

+0

除非他簡化了左側,所以它不會分散我們的手頭問題......; –

回答

2

是的,問題是您的raw_input()正在從標準輸入讀取,這是cat的輸出,它位於EOF處。我的建議是取消cat。沒有必要; Python完全能夠自行讀取文件。在命令行上傳遞文件名,將其打開並自己閱讀。

import sys 

for line in open(sys.argv[1]): 
    # process line 

如果您需要處理多個文件,檢查出fileinput模塊;它很容易處理閱讀多個文件,就好像它們是一樣,這就是cat爲你做的。

+0

我認爲這是一個「四處走動」而不是「跳過」!謝謝。現在看起來很明顯,你說過。殼牌是一個很難打破的習慣。 :) – Wyatt

+0

'貓'即使在外殼也可能是一個壞習慣。除非實際連接文件,否則通常可以通過將標準輸入重定向到文件來保存進程。例如'貓foo | grep bar'和'grep bar kindall

1

目標是讓腳本打印標準錯誤警告,並讓我選擇是否忽略警告並繼續或完全退出。

您希望選擇來自交互式提示,而數據來自文件嗎?那麼,現在你正在做一些與原始程序不同的東西:你正在從不同地方讀這兩樣東西,他們之前來自同一個地方。所以你需要更新你的設計來實現這一點。

爲什麼不的raw_input等待輸入

raw_input等待,只要是需要得到一個線路輸入的。如果標準輸入從文件重定向,則輸入行總是立即可用(當然,受到例如硬盤速度的限制),直到EOF,此時不會有更多的輸入可用。簡而言之,它不會等待您回答問題,因爲它不會等待您提供發票數據:因爲您從文件重定向後不再是數據源。

3

這工作窗口下(我通過運行測試python cons.py < cons.py它,並能看到提示,並沒有得到有關EOF錯誤):

import sys 

for line in sys.stdin: 
    print line 

sys.stdin = open('CON', 'r') 
q = raw_input('---->') 

在Unix系統下,你可能只需要替換「 CON'在/ dev目錄中。