Удаляя правильное значение с плавающей точкой из моей строки
Я использую python для обработки файлов pcap и ввода обработанных значений в текстовый файл. Текстовый файл имеет около 8000 строк, и иногда текстовый файл имеет строку, например 7.70.582 . В моей дальнейшей обработке текстового файла я разделяю файл на строки и извлекаю каждое из значений с плавающей точкой в каждой строке. Тогда я получаю эту ошибку
ValueError: invalid literal for float(): 7.70.582
В таких случаях меня интересует только 7,70, и мне нужно избегать всего после второго десятичного знака, включая его. Есть ли хитрость, чтобы извлечь только строку до первого символа после первой десятичной точки?
Я искал ответ на этот вопрос, и, похоже, такой ситуации не было.
Или есть способ, где я могу пропустить те строки, где происходят подобные ошибки?
3 ответа
Ты можешь использовать 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]
Я не большой поклонник такого подхода, но самым простым может быть что-то вроде:
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
Вы можете использовать регулярное выражение, например:
Если ваша строка похожа на '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