簡體   English   中英

用於比較 2 個 csv 文件中的多列的 Python 腳本

[英]Python Script for comparing multiple columns in 2 csv files

希望有人可以幫助我或將我指向包含正確信息的以前的帖子(我已經搜索了一段時間但沒有成功),

我真的是 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 列匹配,則使用“錯誤 ID”將行附加到 results.csv
  • 如果第 2 列不匹配,但第 1 列和第 3 列匹配,則使用“錯誤的名字”將行附加到 results.csv
  • 如果第 3 列不匹配,但第 1 列和第 2 列匹配,則使用“錯誤的姓氏”將行附加到 results.csv
  • 如果 $csv1 中的整行不在 $csv2 中,則使用“在 CSV1 中而不是 CSV2”中將行附加到 results.csv
  • 如果 $csv2 中的整行不在 $csv1 中,則使用“在 CSV2 中而不是 CSV1”中將行附加到 results.csv

我知道這是一個很大的問題,但如果有人能提供一個帶有一些解釋的腳本來幫助我完成我的 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")
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

我必須比較兩個與示例類似的文件,但只會使用 IP 來查看第 1 列。 文件 1(都是文本文件)

文件1.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.9bf5f gi1/0/4 4

文件2.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/2 gi/1

輸出文件( result.file )將匹配 IP 和其余內容 所以它只匹配 IP 並將放置來自文件 1 結果文件的其余內容

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM