Получение определенного текста из строки в Python3 - PullRequest
1 голос
/ 16 марта 2019

В настоящее время я начинаю писать больше сценариев на Python и могу использовать некоторую помощь! У меня есть функция, которая возвращает статистику с сервера. В настоящее время моя функция:

def get_free_memory(ssh_obj):
stdin, stdout, stderr = ssh_obj.exec_command('free -h')
mem_stats = stdout.readlines()[1]
mem_stats_formatted = " ".join(mem_stats.split())
return mem_stats_formatted

возвращает

Mem: 991M 71M 757M 12M 162M 751M

Я бы хотел дополнительно проанализировать полезную информацию из этого вывода и получить общий объем памяти (991M) и доступную память (757M). Каков наилучший способ сделать это?

Также было бы лучше вернуть оба или иметь две отдельные функции. Один называется get_free_memory и get_available_memory?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 16 марта 2019

Когда вы вызываете mem_stats.split(), вы получаете все разделенные пробелами значения из строки mem_stats в список.

Итак, если интересующие вас значения являются 2-м и 4-м элементом (учитывая, что Mem: также является частью вашей исходной строки), вы можете просто получить к ним доступ из этого списка:

mem_fields = mem_stats.split()

total_mem = mem_fields[1] 
avail_mem = mem_fields[3]

Исходя из того, что вы сказали, я не понимаю, почему вы должны выполнять какой-либо анализ строки, чтобы получить нужные вам поля.

1 голос
/ 16 марта 2019

Просто используйте str.split() и присвойте переменным, также второй аргумент по умолчанию может помочь вам с единственным сценарием полной / бесплатной пользы

def get_free_memory(ssh_obj, raw=True):
    stdin, stdout, stderr = ssh_obj.exec_command('free -h')
    mem_stats = stdout.readlines()[1]

    if raw:
        mem_stats_formatted = " ".join(mem_stats.split())
        return mem_stats_formatted
    else:
        _, total, used, free, shared, cache, avail = mem_stats_formatted.split()
        return total, avail  # You may format this to a string if you wish

Редактировать: я не знаю, что вы делаете сэта информация, но мне кажется более полезным вернуть словарь всех данных и использовать его позже

def get_free_memory(ssh_obj):
    stdin, stdout, stderr = ssh_obj.exec_command('free -h')
    mem_stats = stdout.readlines()[1]
    _, total, used, free, shared, cache, avail = mem_stats_formatted.split()
    memory_info = {
                      'total': total,
                      'used': used, 
                      'free': free,
                      'shared': shared,
                      'cache': cache,
                      'available': avail
                  }

    return memory_info
0 голосов
/ 16 марта 2019

Если вам просто нужны столбцы total и free, вы можете вернуть кортеж.

def get_free_memory(ssh_obj):
    stdin, stdout, stderr = ssh_obj.exec_command('free -h')
    mem_stats = stdout.readlines()[1]
    mem_stats_splitted = mem_stats.split()
    return (mem_stats_splitted[1], mem_stats_splitted[3])
...