csv文件中列值的python精确匹配
我有一个包含若干行和列的csv文件。 我想使用Python3.4过滤我的文件,并创建一个新文件,其中某些行中的值完全匹配。我的问题是,我选择了两列作为筛选行的依据:如果EQA nb与列表中组织的确切名称匹配,则将该行复制到新文件中 我的文件如下所示:csv文件中列值的python精确匹配,python,python-3.x,csv,Python,Python 3.x,Csv,我有一个包含若干行和列的csv文件。 我想使用Python3.4过滤我的文件,并创建一个新文件,其中某些行中的值完全匹配。我的问题是,我选择了两列作为筛选行的依据:如果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,
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个TL,但不是14个LS,例如当前代码所示。
谢谢你的帮助 更换
'BMC,TLS'
与
然后
将匹配“TLS”,但不匹配“LS”。这可以通过将匹配项放入字典中,将if/elif链简化为单个查找来完成,然后可以使用优化
['BMP', 'TLS']
row['organization'] in ['BMP', 'TLS']
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)