【问题标题】:Python: filter lines based on field match from another filePython:根据来自另一个文件的字段匹配过滤行
【发布时间】:2019-11-16 18:10:45
【问题描述】:

我已经用我的其他 python 代码生成了一个列表,看起来像这样。有用逗号分隔的行,它们用单引号引起来。我正在努力根据来自另一个文件的D: 列匹配过滤行,该文件只有起始数字字符。

data = ['A:SET, B:FW.O, C:AS, D:+18700000, E:+12355, F:ROOT', 'A:SET, B:IT, C:AS, D:+22211111, E:+12355, F:ROOT', 'A:SET, B:FW.O, C:AS, D:+177232, E:+12355', 'A:SET, B:IT, C:AS, D:+368399793, E:+12355']

它看起来像单引号中的一行一行。

[
'A:SET, B:FW.O, C:AS, D:+18700000, E:+12355, F:ROOT', 
'A:SET, B:IT, C:AS, D:+22211111, E:+12355, F:ROOT', 
'A:SET, B:FW.O, C:AS, D:+177232, E:+12355', 
'A:SET, B:IT, C:AS, D:+368399793, E:+12355'
]

我有另一个文件,它有过滤号码,要在上面的列表中匹配/

cat fields.txt
+36
+18
#these are country prefixes

我需要将上面的列表 D: 列匹配到“fields.txt”文件的起始编号并仅打印这些行。由于“数据”D: col 编号每次都不同,我需要根据他们的国家前缀进行过滤。

预期输出:

[
'A:SET, B:FW.O, C:AS, D:+18700000, E:+12355, F:ROOT', ###matched as starting num +18 in D: col
'A:SET, B:IT, C:AS, D:+368399793, E:+12355'  ###matched as starting num +36 in D: col
]

我已经尝试了各种示例来编写“FOR”循环并匹配数字,但没有运气。

请帮助我。我是 Python 编程新手。

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    您可以使用包含if 条件的list-comprehension 来执行此操作。这样做的好处是,您决定包含或排除哪一行的逻辑可以很好地隐藏在一个单独的函数中(以下示例中的matches)。

    拥有一个单独的函数使这非常可测试,您可以添加一个文档字符串,它使其更易于维护。

    data = [
        "A:SET, B:FW.O, C:AS, D:+18700000, E:+12355, F:ROOT",
        "A:SET, B:IT, C:AS, D:+22211111, E:+12355, F:ROOT",
        "A:SET, B:FW.O, C:AS, D:+177232, E:+12355",
        "A:SET, B:IT, C:AS, D:+368399793, E:+12355",
    ]
    
    
    def load_codes():
        with open("fields.txt") as fieldfile:
            codes = fieldfile.read().splitlines()
        return codes
    
    
    def matches(row, codes):
        for code in codes:
            if "D:%s" % code in row:
                return True
        return False
    
    
    def main():
        codes = load_codes()
        filtered = [row for row in data if matches(row, codes)]
    
        for row in filtered:
            print(row)
    
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      【解决方案2】:

      我认为不需要拆分数据列表中的每个项目 你可以简单地做

      data = [
      'A:SET, B:FW.O, C:AS, D:+18700000, E:+12355, F:ROOT', 
      'A:SET, B:IT, C:AS, D:+22211111, E:+12355, F:ROOT', 
      'A:SET, B:FW.O, C:AS, D:+177232, E:+12355', 
      'A:SET, B:IT, C:AS, D:+368399793, E:+12355'
      ]
      
      with open("fields.txt") as f:
          codes = f.read().splitlines()
      
      required = []
      for item in data:
          for code in codes:
              if "D:%s" %code in item:
                  required.append(item)
      print(required)
      

      你最终会得到

      [
      'A:SET, B:FW.O, C:AS, D:+18700000, E:+12355, F:ROOT',
      'A:SET, B:IT, C:AS, D:+368399793, E:+12355'
      ]
      

      【讨论】:

      • 感谢dennohpeter。它有帮助并且完全符合我的要求。
      【解决方案3】:

      我认为这个解决方案适合您的需要:

      with open("fields.txt") as f:
          codes = f.read().splitlines()
      
      data = ['A:SET, B:FW.O, C:AS, D:+18700000, E:+12355, F:ROOT', \
              'A:SET, B:IT, C:AS, D:+22211111, E:+12355, F:ROOT', \
              'A:SET, B:FW.O, C:AS, D:+177232, E:+12355', \
              'A:SET, B:IT, C:AS, D:+368399793, E:+12355']
      
      for index, item in enumerate(data):
          sub_items =item.replace(" ", "").split(",")  # to remove spaces and get each individual item
          for sub_item in sub_items: # you can replace this for loop with sub_items[3] if the position of D: is fixed
              if(sub_item.startswith("D:")):
                  value = sub_item.replace("D:", "")  # here you have +xxxx in the data point
                  # you can apply the logic here:
                  for code in codes:
                      if value.startswith(code):
                          print(code, value, index, data[index])
      

      如果fields.txt 包含您在问题中提到的数字,它将打印以下行:

      +18 +18700000 0 A:SET, B:FW.O, C:AS, D:+18700000, E:+12355, F:ROOT
      +36 +368399793 3 A:SET, B:IT, C:AS, D:+368399793, E:+12355
      

      【讨论】:

      • 非常感谢.. 它符合我的要求,但我更喜欢使用其他方法,虽然我不确定哪种方法是最好的.. 再次感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多