2017-11-10 88 views
0

我正在使用python来处理pcap文件并将处理后的值输入到文本文件中。文本文件大约有8000行,有些时候,文本文件有7.70.582这样的字符串。在我对文本文件的进一步处理中,我将文件分割成几行,并提取每行中的每个浮点值。然后,我得到这个错误从我的字符串中剥离正确的浮点值

ValueError: invalid literal for float(): 7.70.582 

在这种情况下,我感兴趣的只是7.70,我需要避免第二个小包括之后的一切。是否有任何技巧只提取字符串,直到第一个小数点后的第一个字符?

我正在寻找这个答案,似乎没有这样的情况问过。

还是有一种方法,我可以跳过这些错误发生的行?

+0

请发布您的文件的一个小例子。 – Ajax1234

+0

findall查找点,然后切掉额外的或任意数量的数字的正则表达式,可选点,可选更多数字 – jonatan

+0

7654 16.317 8.651 7.70.582 17.487 >>这是我的文本中的示例行文件。 –

回答

0

您可以使用str.split()'.'.join

s = "7654 16.317 8.651 7.70.582 17.487" 
final_data = map(float, ['.'.join(i.split('.')[:-1]) if len(i.split('.')) > 2 else i for i in s.split()]) 

输出:

[7654.0, 16.317, 8.651, 7.7, 17.487] 

关于单一字符串:

s = ["7.70.582"] 
final_data = map(float, ['.'.join(i.split('.')[:-1]) if len(i.split('.')) > 2 else i for i in s]) 

输出:

[7.7] 
+0

我比我的方法更喜欢这个,但我建议用'[:2]'索引可能会更好。 – jedwards

+0

Hi @ Ajax1234,我会先试试你的方法,看看它是否能解决我的问题。我使用(x.split()[3])剥离单个字符串。您的解决方案如何看起来就像这个字符串而不是整行。我需要得到的第一个小数后的两个更多的数字 –

+0

@AshishKurian请看我最近的编辑。 – Ajax1234

0

我不是这种方法的一个巨大的风扇,但最简单的可能是这样的:

strs = [ 
    "7", 
    "7.70", 
    "7.70.582", 
    "7.70.582.123" 
] 

def parse(s): 
    s += ".." 
    return float(s[:s.index(".", s.index(".")+1)]) 

for s in strs: 
    print(s, parse(s)) 

这是一个更清晰的方法可能是使用类似:

def parse(s): 
    if s.count('.') <= 1: return float(s) 
    return float(s[:s.index(".", s.index(".")+1)]) 

或者基于关Ajax1234的回答是:

def parse(s): 
    return float('.'.join(s.split('.')[:2])) 

所有版本的输出:

7    7.0 
7.70   7.7 
7.70.582  7.7 
7.70.582.123 7.7 
0

您可以使用正则表达式,像这样的:

https://pythex.org/?regex=%5E(%5B0-9%5D%2B%5C.%5B0-9%5D%2B).*&test_string=7.70.582&ignorecase=0&multiline=0&dotall=0&verbose=0

如果您的线路就像是“7.70.582”这个表达式将提取7.70为第一组:

^([0-9] +。[0-9] +)。*

https://docs.python.org/2/library/re.html

import re 
line = "7654 16.317 8.651 7.70.582 17.487" 
val = line.split(" ")[3] 
m = re.search('^([0-9]+\.[0-9]+).*', val) 
m.group(1) 

'7.70'

float(m.group(1)) 

7。70