2

コマンドプロンプトでユーザーから入力を取得しようとしています。プログラムは、「cat text.txt|./thescript.py」の方法でテキストファイルからデータを読み込みます。

問題のスクリプトの時点で、すべてのデータはすでに読み込まれ、処理され、リストのリストに入れられています。

今、私は疑わしいアイテムを探しているリストのリストを繰り返しています。コードは基本的に次のようになります。

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はcatからの読み取りであり、すでにEOFに達しているため、raw_inputがここでEOFを取得するのはなぜですか?(私は思う)目的は、スクリプトに標準エラーに対する警告を出力させ、警告を無視して続行するか完全に終了するかを選択できるようにすることです。最終的に、すべての出力はstd outに送られ、エラーの警告や応答は含まれません。試行/例外を使用する例を見たことがありますが、このコンテキストではそれを理解できませんでした。(例:raw_inputが入力を待たないのはなぜですか?)

私はこの問題を間違った方法で攻撃しているので、歩き回って飛び越えたほうがよい問題を作成しているのではないかと思います。いつものようにどんな助けでもありがたいです。

4

3 に答える 3

3

これはWindowsで動作します(実行してテストしたところ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ディレクトリ内の何かに置き換える必要があります。

于 2011-07-26T16:59:12.497 に答える
2

はい、問題は、EOFにあるraw_input()の出力である標準入力から読み取っているということです。cat

私の提案は、を削除することcatです。それは必要ない; Pythonは、それ自体でファイルを完全に読み取ることができます。コマンドラインでファイル名を渡し、それを開いて、自分で読んでください。

import sys

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

複数のファイルを処理する必要がある場合は、fileinputモジュールを確認してください。複数のファイルを1つであるかのように簡単に読み取ることがcatできます。

于 2011-07-26T16:46:44.293 に答える
1

目的は、スクリプトに標準エラーに対する警告を出力させ、警告を無視して続行するか完全に終了するかを選択できるようにすることです。

データがファイルから取得されている間に、インタラクティブなプロンプトから選択を取得したいですか?さて、今あなたは元のプログラムとは異なる何かをしている:あなたはそれらが以前同じ場所から来た異なる場所からそれらの2つのことを読んでいる。したがって、それを可能にするためにデザインを更新する必要があります。

raw_inputが入力を待たないのはなぜですか

raw_input入力行を取得するために必要な限り待機します。標準入力がファイルからリダイレクトされている場合、入力の行は、EOFまでは常にすぐに利用できます(たとえば、ハードディスクの速度によって制限されます)。EOFになると、それ以上利用できなくなります。つまり、請求書データの提供を待たないのと同じ理由で、質問に答えるのを待たないのです。ファイルからリダイレクトすると、データソースではなくなるからです。

于 2011-07-26T16:53:45.927 に答える