2011-06-21 47 views
1

我覺得必須有一種更簡單(更簡潔)的方式來使用解析來解析linux上的meminfo文件。該文件的格式是:Python理解合併

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環路ID被用使用的理解和發現我需要他們的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。 –

+0

@Ignacio - 沒有詞典理解標記 – tMC

回答

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

另一種解決方案(請注意,我已經使用字符串數據 - 所以你的情況,你需要修改代碼來從文件中讀取數據) :

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