我需要解析文件。该代码对我不起作用。 该文件具有以下值。
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
非常感谢。
答案 0 :(得分:0)
使用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'])