2015-07-20 84 views
0

这里是我的代码:的Python:ValueError异常:无法将字符串转换为float: '4623634 0'

import csv 
with open ("Filename1.txt") as f: 
    dict1 = {} 
    r = csv.reader(f,delimiter="\t") 
    for row in r: 

     a, b, v = row 
     dict1.setdefault((a,b),[]).append(v) 

    #for key in dict1: 
     #print(key[0]) 
     #print(key[1]) 
     #print(d[key][0]]) 

with open ("Filename2.txt") as f: 
    dict2 = {} 
    r = csv.reader(f,delimiter="\t") 
    for row in r: 

     a, b, v = row 
     dict2.setdefault((a,b),[]).append(v) 

    #for key in dict2: 
     #print(key[0]) 

    count = 0 
    for key1 in dict1: 
     for key2 in dict2: 
      if (key1[0] == key2[0]) and abs(float(key1[1])) - (float(key2[1])) < 10000: 
      count += 1 

以前我收到此错误:

Traceback (most recent call last): 
File "/Users/macbookpro/Desktop/MainDict.py", line 28, in <module> 
if key1[0] == key2[0] and abs(key1[1] - key2[1]) < 10000: 
TypeError: unsupported operand type(s) for -: 'str' and 'str' 

所以当然我试图转向这些字符串转换为整数。不过我当时得到这个错误:

Traceback (most recent call last): 
File "/Users/macbookpro/Desktop/MainDict.py", line 28, in <module> 
if (key1[0] == key2[0]) and abs((int(key1[1])) - (int(key2[1]))) < 10000: 
ValueError: invalid literal for int() with base 10: '1002569 1' 

然后我试图使用浮动,现在我得到这个错误,这就是我现在坚持:

Traceback (most recent call last): 
File "/Users/macbookpro/Desktop/MainDict.py", line 28, in <module> 
if (key1[0] == key2[0]) and abs(float(key1[1])) - (float(key2[1])) < 10000: 
ValueError: could not convert string to float: '2486997 2' 

这里是我的输入文件由什么例子的:

FILENAME1

1 11383002 8 1.16E-05 
1 159962368 1.17E-05 
2 133623587 1.26E-05 
2 1002569 1 3.30E-06 
3 168940139 1.40E-05 
3 49736942 1.43E-05 

文件名2

10 11383002 8 1.16E-05 
5 159962368 1.17E-05 
7 133623587 1.26E-05 
9 1002569 1 3.30E-06 
8 168940139 1.40E-05 
1 49736942 1.43E-05 

现在我的问题是,为什么我得到这个错误。代码中是否有特定的内容?或者我的文本文件有问题。你有什么建议来解决这个问题,我该如何改变我的代码(如果是这样的话)?

+0

你认为“1002569 1”应该是多少? – BrenBarn

+3

'1002569 1'不是有效的浮点数或整数,实际上它不是一个有效的数字,因为它包含空格!所以你想要它是什么? – Kasramvd

+1

谢谢@Kasramvd –

回答

0

我只能猜测什么号码1002569 1应该是,但也许使用split(" ")[0]来得到它的第一部分,并将其转换为int

if ... and abs(float(key1[1].split(" ")[0])) - (float(key2[1].split(" ")[0])) < 10000: 

如果没有空间(如其他行),这也可以工作。

+0

谢谢你,工作!真棒@adrianus –

+0

不客气!出于好奇,@JJJones,你的输入中多余的空间来自哪里? – adrianus

+0

我不完全确定。如果你看一下上面我的一个文件的例子,用三列创建一个字典。我用前两列作为我的钥匙,第三列作为我的价值。所以当python迭代我的文件时,我不知道它是否假设“2351452 1”(我的一个密钥)是单个数字。而在那里的空间显然是这样,所以我得到了错误。但是通过删除你所建议的空间,python可以将它们作为两个单独的数字读取,并且它可以工作haha @adrianus –

相关问题