从 Python3 中的字符串中抓取某些文本

Grabbing certain text from a string in Python3

我目前正在 Python 中开始编写更多脚本,需要一些帮助!我有一个 returns 来自服务器的一些统计数据的功能。目前我的职能:

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

returns

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

我想进一步解析此输出中的有用信息并获取总内存 (991M) 和可用内存 (757M)。执行此操作的最佳方法是什么?

另外 return 两者都更好还是有两个独立的功能。一个叫做 get_free_memory 和 get_available_memory?

谢谢!

当您调用 mem_stats.split() 时,您会将 mem_stats 字符串中所有以空格分隔的值放入列表中。

因此,如果您感兴趣的值是第二个和第四个元素(考虑到 'Mem:' 也是您初始字符串的一部分),您可以从该列表中访问它们:

mem_fields = mem_stats.split()

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

根据你所说的,我不明白为什么你应该进行任何字符串解析来获取你需要的字段。

如果您只需要 totalfree 列,您可以 return 一个元组。

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])

只需使用 str.split() 并分配给变量,第二个默认参数也可以帮助您解决唯一的 total/free 可用场景

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

编辑: 我不知道你用这些信息做什么,但对我来说 return 所有数据的字典并稍后使用它似乎更有用

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