布尔表达式问题,带有来自lIst的字符串值

时间:2008-11-27 19:16:46

标签: python

我有以下问题:

  # line is a line from a file that contains ["baa","beee","0"]
  line = TcsLine.split(",")
  NumPFCs = eval(line[2])
  if NumPFCs==0:
     print line

如果列表的第二个位置的值为== 0,我想打印文件中的所有行。

我打印线条但之后会发生以下情况: 回溯(最近一次调用最后一次):

['baaa','beee','0','\ n']

但是我有下一个错误

ilation.py", line 141, in ?
    getZeroPFcs()
ilation.py", line 110, in getZeroPFcs
    NumPFCs = eval(line[2])
  File "<string>", line 0
你能帮帮我吗? 感谢

What0s

5 个答案:

答案 0 :(得分:1)

让我解释一下你在这里做了什么。

如果你写:

NumPFCs = eval(line[2])

评估顺序为:

  • 取字符串行的第二个字符,即引用'“'
  • 将此引用作为python表达式进行评估,这是一个错误。

如果你把它写成:

NumPFCs = eval(line)[2]

然后评估的顺序是:

  • 评估该行,生成一个python列表
  • 取该列表的第二个元素,即一个字符的字符串:“0”
  • 一个字符串不能与数字进行比较;这也是一个错误。

在您的条款中,您希望执行以下操作:

NumPFCs = eval(eval(line)[2])

或稍微好一些,将NumPFC与字符串进行比较:

if NumPFCs == "0":

但这可能出错的方式几乎无数。您应该忘记eval并尝试使用其他方法:字符串拆分,正则表达式等。其他人已经提供了一些建议,我相信会有更多建议。

答案 1 :(得分:0)

你的问题有点难以阅读,但使用eval肯定不是一个好主意。要么直接进行字符串比较:

line=TcsLine.split(",")
if line[2] == "0":
    print line

或使用int

line=TcsLine.split(",")
if int(line[2]) == 0:
    print line

无论哪种方式,您的错误数据都会让您失望。

我还建议阅读PEP 8

答案 2 :(得分:0)

我在您的代码段中看到了一些问题:

  1. 你假设列表总是至少有3个元素
  2. 如果包含字符串无效,则
  3. eval将引发异常python
  4. 你说你想要第二个元素,但是你可以访问第三个元素。
  5. 这是一种更安全的方法

    line=TcsLine.split(",")
    if len(line) >=3 and line[2].rfind("0") != -1:
         print line
    

答案 3 :(得分:0)

我建议使用正则表达式来捕获如何指定0的所有变体:带双引号,没有任何引号,带单引号,引号外有额外的空格,引号内有空格,你希望如何处理方括号等。

答案 4 :(得分:0)

对猫进行蒙皮的方法有很多,因为它是:)

在开始之前,不要在不属于你的字符串上使用eval ,所以如果字符串已经离开你的程序;即它保留在一个文件中,通过网络发送,有人可以发送令人讨厌的东西。如果有人可以,你可以确定有人会。

您可能想要查看数据格式。将[“baa”,“beee”,“0”,“\ n”]等字符串放在文件中对我来说没有多大意义。

第一种也是最简单的方法就是去除你不需要的东西并进行字符串比较。只要'0'字符串看起来总是相同而你实际上并不是在整数值0之后,只有字符模式:

TcsLine = '["baa","beee","0"]'

line = TcsLine.strip('[]').split(",")
if line[2] == '"0"':
   print line

第二种方式是类似于第一种方式,除了我们将数字字符串转换为整数,产生你正在寻找的整数值(但是打印'line'而没有所有的引号):

TcsLine = '["baa","beee","0"]'

line = [e.strip('"') for e in TcsLine.strip('[]').split(",")]
NumPFCs = int(line[2])
if NumPFCs==0:
   print line

可能是字符串实际上是一个json数组吗?然后,如果我运行Python&lt; 2.6或者只是在Python&gt; = 2.6上导入json,我可能会得到simplejson来正确解析它。然后将生成的'0'字符串转换为整数,如上例所示。

TcsLine = '["baa","beee","0"]'

#import json # for >= Python2.6
import simplejson as json # for <Python2.6

line = json.loads(TcsLine)
NumPFCs = int(line[2])
if NumPFCs==0:
   print line