Я считаю, что должен быть более простой (более чистый) способ использования понятий для анализа файла 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()
Что я делаю не так? Есть ли разумный способ упростить это?
d = {}
with open(f) as fin:
for l in fin:
x = l.split()
d[x[0][:-1]] = int(x[1])
return d
Я считаю эту версию более читаемой:
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
Использование регулярного выражения и понимание списка:
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)
Еще одно решение (обратите внимание, что я использовал строковые данные, поэтому в вашем случае вам нужно изменить код для чтения данных из файла):
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]