读取带标点符号

时间:2016-06-01 02:43:12

标签: python python-3.x eval

我正在尝试使用如下所示的行读取文件:

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:所需的输出是将数字字符串存储为数字,将字符串存储为字符串。 示例:列表&#39; Line&#39;现在看起来像这样:

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

4 个答案:

答案 0 :(得分:2)

正如我在上面的评论中所提到的,使用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(),然后调用int()第4到第7,然后float()再次进行休息。

答案 1 :(得分:0)

// set margins $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); // set auto page breaks $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); 评估表达式。因此,您传入的字符串必须计算为值。当Python尝试评估eval(string)时,它会按预期遇到错误。对于Python和人类读者来说,字符串看起来像垃圾。可接受的输入字符串类似于1A11:A,其中x+1之前已在脚本中定义。

使用eval的示例:

x

答案 2 :(得分:0)

eval()返回传递给它的任何字符串的计算结果。

在您的情况下&#34; 1A11:A&#34;无法评估价值。即使你删除了那个元素,第二个元素又是一个变量吗?否则也会返回错误。

答案 3 :(得分:0)

我在单元测试程序中使用了eval。我想将一个元组(96,6,6,x)传递给一个对象。当x被设置为等于&#39; \&#39;&#39; +&#39; 9:30&#39; +&#39; \&#34;&#39;,等同于硬-coded(96,6,6,&#34; 9:30&#34;),它永远不会通过该值。但是没有改变任何其他东西,传球(96,6,6,(eval x))起作用了。我试图做的就是运行我的单元测试来练习实际用于生产程序的对象。我并不想花很长时间来弄清楚为什么单元测试本身被打破了,尽管该对象在其实际的真实场景中运行良好。如果我以这种方式编码,那么单元测试也是如此。

我认为如果你认为eval是&#34; rhs&#34;工具,你没有问题。意思是,你不能写eval(&#34; x = 7&#34;)并期望eval创建变量x并将其设置为7.任何像这样的字符&#39; =&#39;可能会偏离它所能做的事情。

P.S。对其他新手。在发布Stack Overflow之前先想想。在你认为自己被困之前,先检查一下eval应该做什么。在这种情况下,快点 直接python解释器会话,即:

  
    
      

的eval(&#34; 1A11:A&#34)       Traceback(最近一次调用最后一次):         文件&#34;&#34;,第1行,in         文件&#34;&#34;,第1行           1A11:一              ^       SyntaxError:语法无效