Python 使用列表中的字符串值的布尔表达式出现问题

Python 使用列表中的字符串值的布尔表达式出现问题,python,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'] 但在我出

我有以下问题:

  # 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”,第141行,在?
getZeroPFcs()
ilation.py”,第110行,在getZeroPFcs中
NumPFCs=eval(第[2]行)
文件“”,第0行
你能帮帮我吗? 谢谢


你的问题有点难理解,但是使用eval肯定不是一个好主意。只需执行直接字符串比较:

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

line=TcsLine.split(",")
if int(line[2]) == 0:
    print line
不管怎样,你的坏数据都会让你失望


我也推荐阅读。

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

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

line=TcsLine.split(",")
if int(line[2]) == 0:
    print line
不管怎样,你的坏数据都会让你失望


我还要重新编译阅读。

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

  • 假设列表始终至少有3个元素
  • 如果包含的字符串无效,eval将引发异常
  • 你说你想要第二个元素,但是你访问了第三个元素
  • 这是一种更安全的方法

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

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

  • 假设列表始终至少有3个元素
  • 如果包含的字符串无效,eval将引发异常
  • 你说你想要第二个元素,但是你访问了第三个元素
  • 这是一种更安全的方法

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

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

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

    让我解释一下您在这里做的事情

    如果你写:

    NumPFCs = eval(line[2])
    
    评估的顺序是:

    • 取字符串行的第二个字符,即引号''
    • 将此引号作为python表达式求值,这是一个错误
    如果您将其改为:

    NumPFCs = eval(line)[2]
    
    那么评估的顺序是:

    • 求值该行,生成python列表
    • 以该列表的第二个元素为例,它是一个单字符字符串:“0”
    • 字符串不能与数字进行比较;这也是一个错误
    按照您的说法,您希望执行以下操作:

    NumPFCs = eval(eval(line)[2])
    
    或者,稍微好一点,将NUMPFC与字符串进行比较:

    if NumPFCs == "0":
    

    但是,这种错误的方式几乎是数不胜数的。你应该忘记
    eval
    ,尝试使用其他方法:字符串拆分、正则表达式等。其他人已经提供了一些建议,我相信还会有更多的建议。

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

    如果你写:

    NumPFCs = eval(line[2])
    
    评估的顺序是:

    • 取字符串行的第二个字符,即引号''
    • 将此引号作为python表达式求值,这是一个错误
    如果您将其改为:

    NumPFCs = eval(line)[2]
    
    那么评估的顺序是:

    • 求值该行,生成python列表
    • 以该列表的第二个元素为例,它是一个单字符字符串:“0”
    • 字符串不能与数字进行比较;这也是一个错误
    按照您的说法,您希望执行以下操作:

    NumPFCs = eval(eval(line)[2])
    
    或者,稍微好一点,将NUMPFC与字符串进行比较:

    if NumPFCs == "0":
    

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

    给猫剥皮的方法有很多,可以说:)

    但在我们开始之前,不要对非您的字符串使用eval,因此如果该字符串曾经离开过您的程序;i、 它保存在一个文件中,通过网络发送,有人可以发送一些令人讨厌的东西。如果有人能,你可以肯定有人会的

    您可能需要查看您的数据格式。在文件中放置像[“baa”、“beee”、“0”、“\n”]这样的字符串对我来说没有多大意义

    第一种也是最简单的方法是去掉不需要的东西,然后进行字符串比较。只要“0”-字符串看起来总是一样的,并且您不是真正追求整数值0,只有字符模式:

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

    第二种方法与第一种方法类似,不同之处在于我们将数字字符串转换为整数,生成您要查找的整数值(但打印“line”时不带所有引号):


    是否该字符串实际上是一个json数组?如果运行Python=2.6,我可能会正确地解析它。然后将结果“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
    
    TcsLine='[“baa”、“beee”、“0”]
    #为>=Python2.6导入json
    
    将simplejson作为json导入#对于来说,给猫剥皮的方法有很多,可以这样说:)

    但在我们开始之前,不要对非您的字符串使用eval,因此如果该字符串曾经离开过您的程序;i、 它保存在一个文件中,通过网络发送,有人可以发送一些令人讨厌的东西。如果有人能,你可以肯定有人会的

    您可能需要查看您的数据格式。在文件中放置像[“baa”、“beee”、“0”、“\n”]这样的字符串对我来说没有多大意义

    第一种也是最简单的方法是去掉不需要的东西,然后进行字符串比较。这会有用的