-1

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

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 

非常感谢。

4

3 回答 3

0

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

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

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}]
于 2013-06-11T00:22:23.807 回答
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'])
于 2013-06-12T00:35:06.947 回答
0

我更新了关于python 中这个聚合键值对的其他问题的答案,以便从文件中读取。

于 2013-06-11T00:26:32.727 回答