Консолидация понимания Python

1

Я считаю, что должен быть более простой (более чистый) способ использования понятий для анализа файла meminfo на linux. Формат файла:

MemTotal:        3045588 kB
MemFree:         1167060 kB
Buffers:          336752 kB
Cached:           721980 kB
SwapCached:            0 kB
Active:           843592 kB
Inactive:         752920 kB
Active(anon):     539968 kB
Inactive(anon):   134472 kB

Я попытался переписать идентификатор цикла for, используемый для использования понимания, и нашел, что мне нужно 3 из них...

def parse_mem_file(memfile = '/proc/meminfo'):
    lines = open(memfile, 'r').readlines()
    lines = [line.strip('kB\n') for line in lines if line[-3:] == 'kB\n']
    lines = [line.split(':') for line in lines]
    return dict((key, int(value)) for (key, value) in lines)

print parse_mem_file()

Что я делаю не так? Есть ли разумный способ упростить это?

  • 0
    Краткий ответ: регулярное выражение. Но тогда у вас есть две проблемы.
  • 0
    Это на самом деле только 2 LC.
Показать ещё 3 комментария
Теги:
parsing
list-comprehension

4 ответа

6
Лучший ответ
d = {}
with open(f) as fin:
    for l in fin:
        x = l.split()
        d[x[0][:-1]] = int(x[1])
return d
1

Я считаю эту версию более читаемой:

def parse_mem_file(memfile='/proc/meminfo'):
    data = {}
    with open(memfile, 'r') as f:
        for line in f:
            key, value, size = line.split()
            if size == 'kB':
                data[key[:-1]] = int(value)
    return data
0

Использование регулярного выражения и понимание списка:

def parse_mem_file(memfile = '/proc/meminfo'):
    with open(memfile, 'r') as meminfo:
        return dict(
            (m.group(1), int(m.group(2)))
            for m in [re.match('(.+):\\s*(\\d+)', line) for line in meminfo]
            if m is not None)
0

Еще одно решение (обратите внимание, что я использовал строковые данные, поэтому в вашем случае вам нужно изменить код для чтения данных из файла):

data = """
MemTotal:        3045588 kB
MemFree:         1167060 kB
Buffers:          336752 kB
Cached:           721980 kB
SwapCached:            0 kB
Active:           843592 kB
Inactive:         752920 kB
Active(anon):     539968 kB
Inactive(anon):   134472 kB
"""

res = {}

for line in [x for x in d.split('\n') if x.strip() and ':' in x and 'kB' in x]:
    details = line.split()
    res[details[0][:-1]] = details[-2]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню