从文件读取解析键值对

时间:2013-06-11 00:06:15

标签: python file key-value

我需要解析文件。该代码对我不起作用。 该文件具有以下值。

num=123-456-7890&kv1=1&kv2=12&kv3=0
num=123-456-7890&kv4=1&kv2=12&kv3=0
num=123-456-7890&kv1=10&kv2=12&kv3=0



crs = open("file.txt", "r")
keys = {k: v for k, v in [i.split('=') for i in crs.read().split('&')]}

print keys 

result = {}
for key, value in [s.strip for s in keys.items()]:
    if key == 'kv1':
       result[key] = int(value)

print result 

非常感谢。

3 个答案:

答案 0 :(得分:0)

编辑:只需要kv1和kv2的值之和

使用defaultdict来避免检查是否存在密钥:

from collections import defaultdict

res = defaultdict(int)
for line in crs:
    data = {k: v for k, v in (i.split('=') for i in line.split('&'))}
    for key in ['kv1', 'kv2']:
        res[key] += int(data.get(key, 0))

现在res包含:

defaultdict(<class 'int'>, {'kv2': 36, 'kv1': 11})

像普通字典一样访问:

>>> res['kv1']
11
>>> res['kv2']
36

以前的解决方案

您可以在一行中执行此操作:

>>> [{k: v.strip() for k, v in [i.split('=') for i in line.split('&')]} 
     for line in crs]
[{'kv1': '1', 'kv2': '12', 'kv3': '0', 'num': '123-456-7890'},
 {'kv2': '12', 'kv3': '0', 'kv4': '1', 'num': '123-456-7890'},
 {'kv1': '10', 'kv2': '12', 'kv3': '0', 'num': '123-456-7890'}]

如果您只需要'kv1',则可以直接过滤它:

>>> [{k: int(v) for k, v in [i.split('=') for i in line.split('&')] 
     if k == 'kv1'} for line in crs]
[{'kv1': 1}, {}, {'kv1': 10}]

答案 1 :(得分:0)

我更新了您的另一个问题的答案Aggregating key value pair in python,以便从文件中读取。

答案 2 :(得分:0)

这就是我想要的。我相信它可以更好地进行优化

crs = open('file.txt','r')
result={}
k1 = 0
k2 = 0
for line in crs.read().strip().split('\n'):
    for pair in line.split('&'):
        (key,value) = pair.split('=')
        if key in ('kv1','kv2'):
           if key == 'kv1':
              k1 += int(value)
              result[key] = int(k1)
           else:
              k2 += int(value)
              result[key] = int(k2)
        else:
             result[key] = value

print result['num']+'&'+'kv1='+str(result['kv1'])+'&'+'kv2='+str(result['kv2'])