2

我正在尝试编写一个非常简单的 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

尝试使用 exec 而不是 eval。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))

用法:pywc.py predicate [FILE]...
打印满足predicate给定FILE(s)的行数。
如果没有FILE,或者当 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 回答