我正在使用python处理pcap文件并将处理后的值输入到文本文件中。文本文件有大约8000行,有时,文本文件有7.70.582之类的字符串。在我对文本文件的进一步处理中,我将文件拆分为行并提取每行中的每个浮点值。然后我收到此错误
ValueError: invalid literal for float(): 7.70.582
在这种情况下,我只对7.70感兴趣,我需要避免包括它在内的第二个小数后的所有内容。是否有任何技巧只能提取字符串,直到第一个小数点后的第一个字符?
我正在寻找这个问题的答案,似乎以前没有问过这样的情况。
或者是否有一种方法可以跳过发生此类错误的那些行?
答案 0 :(得分: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]
答案 1 :(得分: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
答案 2 :(得分:0)
您可以使用正则表达式,如下所示:
如果您的行符合“7.70.582&#39;这个正则表达式将7.70引入第一组:
^([0-9] +。[0-9] +)。*
https://docs.python.org/2/library/re.html
float(m.group(1))
&#39; 7.70&#39;
where("score::int >= ?", 80) # PostgreSQL-specific casting syntax
where("cast(score as int) >= ?", 80) # Standard SQL type cast
7.70