我正在尝试编写一个非常简单的Python实用程序供个人使用,它计算文本文件中为命令行指定的谓词为true的行数。这是代码:
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,所以我不知道它的怪癖,如果有的话)。请告诉我如何解决这个问题以使其发挥作用。
答案 0 :(得分:11)
尝试使用exec而不是eval。解释了2之间的差异here
答案 1 :(得分:5)
尝试:
for line in handle:
result += 1 if eval(pred) else 0
答案 2 :(得分: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
(s)FILE
的行数
没有FILE
,或者当FILE是 - 时,读取标准输入。
答案 3 :(得分:2)
python eval()函数计算表达式而不是语句。尝试用以下代码替换eval()行:
result += eval(pred + " else 0")
答案 4 :(得分:0)
真的,你正在寻找编译功能:
>> a = compile("toAdd = 1 if int('0') == 0 else 0", 'tmp2.py', 'exec')
>>> eval(a)
>>> toAdd
1
eval仅用于表达式...编译时将语句编译成一个可以进行eval的代码块。