Python 读取带标点符号的字符串时出现 eval() SyntaxError

Python eval() SyntaxError when reading string with punctuation

我正在尝试读取包含如下行的文件:

1A11:A,GSEKMSTAISVLLAQAVFLLLTSQR,0.724,0,0,1,0,0,1.000,225.000,0.004,0.915

使用此代码:

for line in datafile:
    line = line.split(',')
    for element in line:
        line[count] = eval(element)

我收到以下错误:

    "/Users/Auyer/CODING/PycharmProjects/INSERTGenerator/InsertGen.py", line 10, in fileSplitter
line[count] = eval(element)
File "<string>", line 1
1A11:A
   ^
SyntaxError: invalid syntax

该程序在计算数字时运行完美,但在计算标点字符串时无法运行。

编辑 1:所需的输出是将数字字符串存储为数字,将字符串存储为字符串。 示例:列表 'Line' 现在看起来像这样:

['1AFP:A', 'KYKKDNIKQSGKICKYVKKPRDAKFSYKGKYC', -1.494, 0, 1, 0, 0, 0, 9.000, 105.000, 0.021, 0.242]

eval(string) 计算一个表达式。因此,您传入的字符串必须评估为一个值。当 Python 尝试评估 1A11:A 时,它会按预期发生错误。对于 Python 和人类读者来说,该字符串看起来像垃圾。可接受的输入字符串类似于 x+1,其中 x 之前已在脚本中定义。

使用eval的示例:

>>> x = 1
>>> eval('x + 1')
2 

eval() returns 传递给它的任何字符串的评估结果。

在您的情况下,“1A11:A”无法计算为值。即使你删除了那个元素,第二个元素是一个变量吗?否则也会 return 出错。

正如我在上面的评论中提到的,使用 eval() 是一个非常糟糕的想法,很多比我聪明和更有经验的人都同意,所以我同意,你也应该这样做。

首先,我们假设每一行都具有相同的结构和相同数量的元素,具有相同的转换要求(string、int、float)。解析这些行的工作量取决于您需要对结果做什么。如果您不介意像 01 这样的值是浮点数,那么解析很简单:

for line in inputfile:
    data = line.split(",") # make list
    newdata = data[0:2] + [float(item) for item in data[2:]] 
    # pull in 1st two elements, which are strings
    # then call float() on the rest of them, and add them to new list

您现在可以随意使用 newdata

如果列表中间的 0, 0, 1, 0, 0 值需要保持整数,解析需要多两行,但仍然很简单:

for line in inputfile:
    data = line.split(",")
    newdata = data[0:2] + [float(data[2])]
    newdata += [int(item) for item in data[3:8]]
    newdata += [float(item) for item in data[8:]]

这里我们使用列表理解来处理 data 列表的切片 - 添加前两个字符串,然后在第 3 个项目上调用 float(),然后在4 号到 7 号,然后 float() 再次 float()

我在单元测试程序中使用了 eval。我想将一个元组 (96,6,6,x) 传递给一个对象。当 x 设置为等于 '\"'+'9:30'+'\"' 时,相当于硬编码 (96,6,6,"9:30"),它永远不会通过该值传递.但是在不改变任何其他东西的情况下,传递 (96,6,6,(eval x)) 有效。我想要做的只是 运行 我的单元测试来测试实际将在生产程序中使用的对象。我不想花很长时间来弄清楚为什么单元测试本身被破坏了,尽管该对象在其实际的真实场景中运行良好。如果我这样编码,单元测试也是如此。

我认为如果您将 eval 视为 "rhs" 工具,您将不会有任何问题。意思是,您不能编写 eval("x=7") 并期望 eval 创建变量 x 并将其设置为 7。任何像“=”这样的字符都可能超出它的范围。

P.S。给其他新手。在 Stack Overflow post 之前先想想。在您认为自己被难住了之前检查 eval 应该做什么。在这种情况下,快速 直接 python 解释器会话,即:

eval("1A11:A") Traceback (most recent call last): File "", line 1, in File "", line 1 1A11:A ^ SyntaxError: invalid syntax