如何比较两个CSV文件?

5

我有一个 csv 文件1,它的格式如下:

FLAGSTAFF   AZ  50244.67    5.02    KA1_Podium_Garage_S
FLAGSTAFF   AZ  33752.13    3.38    KA1_Podium_Garage_S
FLAGSTAFF   AZ  11965.5      1.2    KA1_Podium_Garage_S
FLAGSTAFF   AZ  3966.48      0.4    KA1_Podium_Garage_S
SEATTLE     WA  12646.9      1.26   KA1_Podium_Garage_S
SEATTLE     WA  225053.92   22.51   KA1_Podium_Garage_S
SEATTLE     WA  23974.3      2.4    KA1_Podium_Garage_S
SEATTLE     WA  7036.4       0.7    KA1_Podium_Garage_S
SEATTLE     WA  3021.93      0.3    KA1_Podium_Garage_S

我有一个名为 2 的 CSV 文件,格式如下:

Alabama     AL  1
Alaska      AK  2
Arizona     AZ  4
Arkansas    AR  5
California  CA  6
Colorado    CO  8
Connecticut CT  9
SEATTLE     WA  53

现在我需要通过比较第二列,在csv文件1中添加来自csv文件2的第三列值。
例如,它应该像这样,
AZ代码是4 WA代码是53 无论在我的csv文件1中出现AZ、WA,代码都应该被附加到一列中。
我的输出应该看起来像这样:
FLAGSTAFF   AZ  50244.67    5.02    KA1_Podium_Garage_S 4
FLAGSTAFF   AZ  33752.13    3.38    KA1_Podium_Garage_S 4
FLAGSTAFF   AZ  11965.5      1.2    KA1_Podium_Garage_S 4
FLAGSTAFF   AZ  3966.48      0.4    KA1_Podium_Garage_S 4
SEATTLE     WA  12646.9      1.26   KA1_Podium_Garage_S 53
SEATTLE     WA  225053.92   22.51   KA1_Podium_Garage_S 53
SEATTLE     WA  23974.3      2.4    KA1_Podium_Garage_S 53
SEATTLE     WA  7036.4       0.7    KA1_Podium_Garage_S 53
SEATTLE     WA  3021.93      0.3    KA1_Podium_Garage_S 53

这是我尝试的代码:

with open("/home/sumit/Desktop/CSV_FILE1.csv", "r") as f:
    first = {rows[1]: rows[0:] for rows in list(csv.reader(f))}

# compare second csv and append Code
with open("CSVFILE2.csv", "r") as f1:
    for row in csv.reader(f1):
        if row[1] in first:
            first[row[1]].append(row[2])

# convert dict back to list
merged = [(k,) + tuple(v) for k, v in first.items()]

# write list to output csv
with open("output.csv", "w") as f1:
    csv.writer(f1).writerows(merged)

我得到的输出类似于:

AZ  FLAGSTAFF   AZ  44230.4 4.42    KA1_Podium_Garage_S 4
WA  SEATTLE     WA  45329.3 4.53    KA1_Podium_Garage_S 53

一个 dict 只能为每个键存储一个值;如果您尝试使用不同的值多次添加相同的键,则只会保留最新的值。 - R Nar
我建议改变你的逻辑:你的第二个csv文件似乎只有每个州的一个实例。用那个csv创建一个字典,其中键值对是州:数字,然后遍历第一个csv并根据需要添加值。 - R Nar
1个回答

2

这一行代码是基于你的第一个文件中的州缩写创建一个字典。看起来有些不对,因为字典中每个键只能出现一次,而你有多行使用了相同的“AZ”。

first = { rows[1]: rows[0:] for rows in list(csv.reader(f)) }

相反,您应该基于第二个文件创建字典:

with open("CSVFILE2.csv", "r") as f1:
    code = { row[1]: row[2] for row in csv.reader(f1) }

然后,循环遍历您的第一个文件,并将适当的代码附加到每一行。
with open("/home/sumit/Desktop/CSV_FILE1.csv", "r") as f:
    merged = [ row + [code[row[1]]] for row in csv.reader(f) ]

并将合并后的数据写入新文件中。


row + [code[row[1]]] 的解释:

如果 row["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S"],那么

  • row[1]"AZ"
  • code[row[1]]code["AZ"],即 4
  • [code[row[1]]] 是列表 [4]
  • row + [code[row[1]] 是列表拼接,生成所需的新行值:["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S", 4]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接