【问题标题】:Reading from file to parse key value pair [duplicate]从文件中读取以解析键值对[重复]
【发布时间】:2013-06-12 08:35:06
【问题描述】:

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

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 

非常感谢。

【问题讨论】:

    标签: python file key-value


    【解决方案1】:

    我更新了您对此Aggregating key value pair in python 的其他问题的答案,以便从文件中读取。

    【讨论】:

      【解决方案2】:

      编辑:只需要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}]
      

      【讨论】:

      • 如何聚合这些值,我需要打印出以下值,num,kv1和kv2的总和
      • 更新了我的解决方案。我在您的问题中找不到任何提示您正在寻找总和。任何地方都没有+sum
      • 感谢您发布解决方案。
      • 感谢您的新解决方案。不幸的是,您的解决方案在 num 方面不起作用。我需要打印出 num,以及 kv1 和 kv2 的合计值。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        • 2017-07-08
        • 1970-01-01
        • 2021-08-20
        • 2017-12-26
        • 1970-01-01
        相关资源
        最近更新 更多