2017-11-10 84 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