【问题标题】:Python Script for comparing multiple columns in 2 csv files用于比较 2 个 csv 文件中的多列的 Python 脚本
【发布时间】:2017-05-12 10:04:05
【问题描述】:

希望有人可以帮助我或将我指向具有正确信息的以前的帖子(我已经搜索了一段时间但没有成功),

我对 Python 脚本非常陌生,并且正在花时间学习以提高我的技能,但是我在学习的同时突然需要做以下事情 - 我希望这能帮助我在学习 Python 时更多地了解 Python在别处学习基础知识

我有两个具有相同列数据但标题不同的 CSV - 下面的示例

----$csv1------  
ID, FirstName, Surname

1, John, Smith

2, Steve, Davis

, John,Parrot,

4, Dave,Smith

5, Alan, Taylor

----$csv2------  
Employee ID, First Name, Given Surname

1, John, Smith

2, Steven, Davis

3, John, Parrott

4, Dave, Allen

6, Mike, Angelo

我的脚本要求是比较 2 个 csv 并使用结果创建第三个文件 (results.csv)

  • 如果第 1,2 和 3 列匹配,则使用“正确”将行附加到 results.csv
  • 如果第 1 列不匹配,但第 2 和 3 列匹配,则将行追加到 results.csv 中并带有“错误 ID”
  • 如果第 2 列不匹配,但第 1 和 3 列匹配,则将行追加到 results.csv 中并带有“错误的名字”
  • 如果第 3 列不匹配,但第 1 和 2 列匹配,则将行附加到 results.csv 并带有“错误的姓氏”
  • 如果 $csv1 中的整行不在 $csv2 中,则将行附加到 results.csv 中并带有“在 CSV1 中不是 CSV2”
  • 如果 $csv2 中的整行不在 $csv1 中,则将行附加到 results.csv 中,并带有“在 CSV2 中不是 CSV1”

我知道这是一个很大的问题,但如果有人能提供一个带有一点解释的脚本来帮助我完成 Python 之旅,我将不胜感激!

谢谢大家。

----添加脚本-----

import csv
CSV1_tuples = []
CSV2_tuples = []

with open("DB1.csv") as CSV2:
    csv_CSV2 = csv.reader(CSV2)
    for row in csv_CSV2:
        CSV2_tuples.append(tuple(row[0:3]))

with open("DB2.csv") as CSV1:
    csv_CSV1 = csv.reader(CSV1)
    for row in csv_CSV1:
        CSV1_tuples.append(tuple(row[0:3]))
        if tuple(row[0:3]) in CSV2_tuples:
            print(( row[0:3] ), "In both DB1 & DB2")
        if tuple(row[1:3]) in CSV2_tuples:
            print(( row[0:3] ), "Wrong ID")

【问题讨论】:

  • 到目前为止,您为自己解决了这个问题做了什么?请向我们展示您的代码,我们可以帮助改进它。但这不是一个“为你编码”的网站。

标签: python


【解决方案1】:
import csv
import re


def get_csv_data(csv_file, row, cell=None):
    """
    :param csv_file: Name of csv file
    :param row: Row number that you want( counting starts from top to bottom)
    :param cell: cell number that you want(counting starts from left to right)
    If you give a cell number, the content of that cell will be returned.
    If cell =
    :return: cell content
    """
    ls = []
    with open(csv_file, newline='') as csvfile:
        csv_file = csv.reader(csvfile, delimiter=' ', quotechar='|')
        for rows in csv_file:
            ls.append(str(rows[0]).split(","))
        if cell is not None:
            return re.sub(r'\W+', '', str(ls[row-1]).split(",")[cell-1])
        else:
            return ls[row-1]

print(get_csv_data('csv1.csv', 2, 2)) #get row 2, cell 2 from csv1 -> returns John
print(get_csv_data('csv1.csv', 2)) #get row 2 from csv1 -> returns a list with all values from the row: [1, 'John', 'Smith']


def write_to_csv(ls):
    """
    :param ls: list argument to be written in CSV file
    List item will be written as a row, with every list value on a separate cell
    :return: None
    """
    with open("results.csv", "w") as f:
        writer = csv.writer(f)
        writer.writerow(ls)

这是您从 CSV 文件获取数据并写入另一个文件的方式。您可以进一步实现 if 语句

row = get_csv_data('csv1.csv', 1) #get first row from csv1.csv, as a list
row.append("Correct") #add the Correct value
write_to_csv(row) #write all row 1 to CSV - will be 1, John, Smith, Correct

【讨论】:

    【解决方案2】:

    我必须比较两个与示例类似的文件,但只会查看带有 IP 的列 1。文件1(都是文本文件)

    file1.txt

    IP - MAC 地址 - 端口 - IDF 1 0.2.1.5 00:07:5f:c2:9b:f2 gi1/0/2 2 10.2.1.3 0007.5fc2.9bf4 gi1/0/3 3 10.2.1.7 0007.5fc2.9bf5 gi1/0/4 4

    file2.txt

    IP - MAC 地址 - 端口 10.2.1.5 0007.5fc2.9bf6 gi1/0/2 10.2.1.9 0007.5fc2.9bf7 gi1/0/2 10.2.1.10 0007.5fc2.9bf8 gi1/0/2

    输出文件 (result.file) 将匹配 IP 和其余内容因此它仅匹配 IP 并将从文件 1 结果文件中放置其余内容

    10.2.1.5 00:07:5f:c2:9b:f2 gi1/0/2 2 谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多