Удаляя правильное значение с плавающей точкой из моей строки

Я использую 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

Вы можете использовать регулярное выражение, например:

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

Другие вопросы по тегам