2

コマンドラインで指定された述語がtrueであるテキストファイルの行数をカウントする、個人使用のための非常に単純なPythonユーティリティを作成しようとしています。コードは次のとおりです。

import sys

pred = sys.argv[2]
if sys.argv[1] == "stdin" :
    handle = sys.stdin
else :
    handle = open(sys.argv[1])
result = 0
for line in handle :
    eval('result += 1 if ' + pred + ' else 0')
print result

を使用して実行するとpython count.py myFile.txt "int(line) == 0"、次のエラーが発生します。

  File "c:/pycode/count.py", line 10, in <module>
    eval('toAdd = 1 if ' + pred + ' else 0')
  File "<string>", line 1
    toAdd = 1 if int(line) == 0 else 0

これは私には完全に有効なPythonコードのように見えます(Pythonのevalをこれまで使用したことがないので、その癖があればわかりません)。これを修正して機能させる方法を教えてください。

4

5 に答える 5

11

evalの代わりにexecを使用してみてください。2つの違いはここで説明されています

于 2009-09-21T20:55:24.440 に答える
5

試す:

for line in handle:
  result += 1 if eval(pred) else 0
于 2009-09-21T20:57:49.797 に答える
3
#!/usr/bin/env python
import fileinput, sys

pred = eval('lambda line: ' + sys.argv[1])
print sum(1 for line in fileinput.input(sys.argv[2:]) if pred(line))

使用法:指定された(s)pywc.py predicate [FILE]...
を満たす行数を出力します。 がない場合、またはFILEが-の場合は、標準入力を読み取ります。predicateFILE
FILE

于 2009-09-21T21:06:57.630 に答える
2

python eval()関数は、ステートメントではなく式を評価します。eval()行を次のように置き換えてみてください。

result += eval(pred + " else 0")
于 2009-09-21T20:56:37.497 に答える
0

本当に、あなたはコンパイル機能を探しています:

>> a = compile("toAdd = 1 if int('0') == 0 else 0", 'tmp2.py', 'exec')
>>> eval(a)
>>> toAdd
1

evalは、式のみを対象としています...ステートメントのシーケンスをコンパイルしてコードブロックにコンパイルし、それを評価することができます。

于 2009-09-21T20:59:33.647 に答える