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)。解析这些行的工作量取决于您需要对结果做什么。如果您不介意像 0
和 1
这样的值是浮点数,那么解析很简单:
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
我正在尝试读取包含如下行的文件:
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)。解析这些行的工作量取决于您需要对结果做什么。如果您不介意像 0
和 1
这样的值是浮点数,那么解析很简单:
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