【问题标题】:python exact match of column value in csv filescsv文件中列值的python完全匹配
【发布时间】:2015-01-29 15:24:06
【问题描述】:

我有一个包含多行和多列的 csv 文件。 我想使用 python 3.4 过滤我的文件并创建一个与行中某些值完全匹配的新文件。我的问题是我选择 2 列来过滤行:如果 EQA nb 与列表中组织的确切名称匹配,则将该行复制到新文件中。

我的文件是这样的:

EQA_nb,organization,a,b,c,d
16,TCS,a1,b1,c1,d1
14,LS,a2,b2,c2,d2
14,BMC,a3,b3,c3,d3
2,TLS,a4,b4,c4,d4
6,LCHC,a5,b5,c5,d5
14,TLS,a6,b6,c6,d6
etc..

我的代码是:

import csv
with open ('data.csv','w',newline='') as outf, open('output.csv','r', newline='')as inf:
    reader = csv.DictReader(inf, delimiter=',')
    writer = csv.DictWriter(outf, fieldnames=reader.fieldnames, delimiter=',')
    writer.writeheader()

    for row in reader:
        if ((row["EQA_nb"]== '6' and row["organization"] in "EP, LCHC, SP")
                or (row["EQA_nb"]== "2" and row["organization"] in "AMC, LCHC, SGPLP, TCS, TLS")
                or (row["EQA_nb"]== "7" and row["organization"] in "GP")
                or (row["EQA_nb"]== "8" and row["organization"] in "LFMC")
                or (row["EQA_nb"]== "9" and row["organization"] in "LS")
                or (row["EQA_nb"]== "11" and row["organization"] in "DP, WSS")
                or (row["EQA_nb"]== "13" and row["organization"] in "TRP")
                or (row["EQA_nb"]== "14" and row["organization"] in "BMC,TLS")): 

            writer.writerow(row)

我希望新文件显示与指定的行值完全匹配,即显示 14 TLS 但不显示 14 LS,例如当前代码所示。 感谢您的帮助!

【问题讨论】:

    标签: python python-3.x csv


    【解决方案1】:

    替换

    'BMC,TLS'
    

    ['BMP', 'TLS']
    

    然后

    row['organization'] in ['BMP', 'TLS']
    

    将匹配“TLS”但不匹配“LS”。

    【讨论】:

      【解决方案2】:

      这可以通过将匹配项放入字典中非常巧妙地完成,将 if/elif 链减少到单个查找,而这又可以使用operator.itemgetter 进行优化。

      import csv
      import operator
      
      
      mapping = {
          "6": ["EP", "LCHC", "SP"],
          "2": ["AMC", "LCHC", "SGPLP", "TCS", "TLS"],
          "7": ["GP"],
          "8": ["LFMC"],
          "9": ["LS"],
          "11": ["DP", "WSS"],
          "13": ["TRP"],
          "14": ["BMC", "TLS"],
      }
      
      
      kv = operator.itemgetter("EQA_nb", "organization")
      
      
      with open("data.csv", "w", newline="") as outf, open("output.csv", "r", newline="") as inf:
          reader = csv.DictReader(inf, delimiter=",")
          writer = csv.DictWriter(outf, fieldnames=reader.fieldnames, delimiter=",")
          writer.writeheader()
      
          for row in reader:
              eqa, org = kv(row)
              if org in mapping.get(eqa, []):
                  writer.writerow(row)
      

      【讨论】:

        猜你喜欢
        • 2014-08-25
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 2021-08-04
        • 2021-08-07
        相关资源
        最近更新 更多