【问题标题】:Compare CSV files using python使用 python 比较 CSV 文件
【发布时间】:2014-04-10 17:44:10
【问题描述】:

您好,我在比较两个 csv 文件时需要帮助...并将两个文件中的匹配记录放入一个输出文件中...将不匹配的记录放入另一个输出文件中... 例如:我的第一个 csv 文件包含两列 Name 和 Salary,数据为

A 20000
B 15000
C 10000
D 5000

第二个 CSV 文件包含姓名和薪水,数据为

A 40000
D 10000
B 15000

我的输出应该是两个文件,匹配文件分别包含来自 file1 和 file2 的 B 15000 B 15000 并且第二个文件包含不匹配的记录为

A 20000,A 40000
C 10000,-------(no record in file2)
D 5000, D 10000

【问题讨论】:

  • 使用 docs.python.org/2/library/csv.htmldocs.python.org/2/library/functions.html#map 看看你自己怎么一点都不累我为你指明了正确的方向,我投票赞成结束这个问题,因为它太宽泛了,你应该至少尝试自己解决问题。
  • 您可以将您的值放入带有键的字典中,例如'A':20000,然后比较第二个文件的值,如果它大于字典的值,则将其替换为新文件
  • 我试过这个脚本 import csv file1 = open("1.csv", "r") reader1=csv.reader(file1) reader1.next() file2 = open("2.csv ", "r") reader2=csv.reader(file2) reader2.next() file3 = open("file3.txt", "w") file4 = open("file4.txt", "w") file1.seek (0,0) file2.seek(0,0) list1 = file1.readlines() list2 = file2.readlines() for i in list1: for j in list2: if i == j: file3.write(i) file3 .write(j) else : file4.write(i) file4.write(j) 但 itz 也采用标头,并且在所有不匹配的文件中进行比较

标签: python csv comparison


【解决方案1】:
f1_in = open("f1.csv","r")
f1_dict = {}
for line in f1_in:
    l = line.split()
    f1_dict[l[0].strip()] = l[1].strip()
f1_in.close()

f2_in = open("f2.csv","r")
f2_dict = {}
for line in f2_in:
    l = line.split()
    f2_dict[l[0].strip()] = l[1].strip()
f2_in.close()

f_same = open("same.txt","w")
f_different = open("different.txt","w")

for k1 in f1_dict.keys():
    if k1 in f2_dict.keys() \
    and f2_dict[k1] == f1_dict[k1]:
        f_same.write("{0}, {1}\n".format(str(k1)+" "+str(f1_dict[k1]),
                                         str(k1)+" "+str(f2_dict[k1])))
    elif not k1 in f2_dict.keys():
        f_different.write("{0}, {1}\n".format(str(k1)+" "+str(f1_dict[k1]),
                                              "------"))
    elif not f2_dict[k1] == f1_dict[k1]:
        f_different.write("{0}, {1}\n".format(str(k1)+" "+str(f1_dict[k1]),
                                              str(k1)+" "+str(f2_dict[k1])))

f_same.close()
f_different.close()

编辑: 在循环键之前按键对字典进行排序 (for k1 in f1_dict.keys()):

# get the keys as a list
my_keys = f1_dict.keys()
# sort it
my_keys.sort()
# use sorted list
for k1 in my_keys:

在循环键之前按值对字典进行排序:

# return a list of tuple : [(key1,value1),(key2,value2)]
my_zip = zip(f1_dict.keys(), f1_dict.values())
# now you have a list you can sort it :
my_sorted_list = sorted(my_zip, key=lambda value, value[2])

key=lambda value, value[2] 表示my_zip 将使用列表中每个元组的第二个值进行排序。

# use sorted list
for t in my_sorted_list:
    # t is a tuple
    k1 = t[0]
    value = t[1]

【讨论】:

  • 在 f1_dict[l[0].strip()] = l[1].strip() 行中出现错误“列表索引超出范围”
  • 如何修改脚本,使其可以采用任意数量的列...现在它只进行 2 列比较...而且我需要对输出文件数据进行排序。跨度>
  • 在这段代码中,我假设文件 1 中的所有行都已满,也许你的文件 1 有一行像“E”,之后没有值。
  • 如果要比较多个值,可以使用列表/元组作为 dict 的值。按键排序:您使用 (my_kyes = my_dict.keys()) 获取键,然后对它进行排序 (my_keys.sort())。要按值排序(如果不是列表),压缩键和值 (my_list = zip(dict.keys(),dict.values())),那么可以按值排序 (my_sorted_list = sorted(my_list, key= lambda 值:值[1]))
  • 如果你可以 cft...请在上面的脚本中进行这些更改并评论...我是 python 脚本的初学者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多