簡體   English   中英

Python:比較2個CSV文件中的3列,如果相等則輸出

[英]Python: compare 3 columns in 2 csv files and output if they are equal

因此,我有兩個CSV文件,它們試圖進行比較並獲得相似項目的結果。 第一個文件hosts.csv如下所示:

Path    Filename    Size    Signature
C:\     a.txt       14kb    012345
D:\     b.txt       99kb    678910
C:\     c.txt       44kb    111213

第二個文件masterlist.csv如下所示:

Filename    Signature
b.txt       678910
x.txt       111213
b.txt       777777
c.txt       999999

如您所見,行不匹配,並且masterlist.csv始終大於hosts.csv文件。 我要搜索的唯一部分是簽名部分。 我知道這看起來像:

hosts [3] == masterlist [1]我正在尋找一種解決方案,該解決方案將為我提供以下內容(基本上是帶有新RESULTS列的hosts.csv文件):

Path    Filename    Size    Signature    RESULTS
C:\     a.txt       14kb    012345       NOT FOUND in masterlist
D:\     b.txt       99kb    678910       FOUND in masterlist (row 1)
C:\     c.txt       44kb    111213       FOUND in masterlist (row 2)

我已經搜索了帖子,並在這里找到了類似的內容,但是由於我仍在學習python,所以我不太了解。

使用Python 3.5編輯

您可以嘗試以下方法:

import csv
masterlist = list(csv.reader(open('masterlist.csv')))
host = list(csv.reader(open('host.csv')))
masterlist_dict = {a:b for a, b in zip(["Filename", "Signature"], masterlist)}
final_result = [["Path", "Filename", "Size","Signature", "RESULTS"]] +
               [[path, filename, size, signature, "NOT FOUND"] 
                if signature in masterlist_dict["Signature"] 
                else [path, filename, size, signature, 
                      "FOUND (row {})".format(
                         masterlist_dict["Signature"].index(signature) 
                      for path, filename, size, signature in host]
write = csv.writer(open("new_host.csv", 'a')))
write.writerows(final_results)

使用csv.DictReadercsv.DictWriter對象的解決方案:

import csv

with open('hosts.csv', 'r') as hosts, open('masterlist.csv', 'r') as mlist, \
     open('result.csv', 'w', newline='') as res:

    host_reader = csv.DictReader(hosts, delimiter=' ', skipinitialspace=True)
    mlist_reader = csv.DictReader(mlist, delimiter=' ', skipinitialspace=True)
    writer = csv.DictWriter(res, fieldnames=host_reader.fieldnames + ['Result'], delimiter='\t')

    mlist_data = {r['Signature']: mlist_reader.line_num-1 for r in mlist_reader}
    fmt = '{0}FOUND in masterlist{1}'   # prepearing output format for `Result` field
    writer.writeheader()                # writing header

    for r in host_reader:
        if r['Signature'] in mlist_data:
            r['Result'] = fmt.format(""," (row "+str(mlist_data[r['Signature']])+")")
        else:
            r['Result'] = fmt.format("NOT ","")
        writer.writerow(r)

result.csv內容:

Path    Filename    Size    Signature   Result
C:\ a.txt   14kb    012345  NOT FOUND in masterlist
D:\ b.txt   99kb    678910  FOUND in masterlist (row 1)
C:\ c.txt   44kb    111213  FOUND in masterlist (row 2)

我總是希望使用pandas數據框來執行此類操作,因為它提供了廣泛的不同功能來保存和編輯.csv文件。 熊貓

df = pd.DataFrame.from_csv('1.csv')
df2 = pd.DataFrame.from_csv('2.csv')
df['result'] = 0
for i in xrange(df['signature'].__len__()):
    for j in xrange(df2['signature'].__len__()):
        if df['signature'][i] == df2['signature'][j]:
            df.loc[i, ('result')] = 'found in \'2.csv\' at row ' + str(
                df2.signature[df2.signature == df2['signature'][j]].index.tolist())
            break
df.to_csv('out.csv')

其中1.csv = hosts.csv2.csv = masterlist.csv ,並將整個輸出另存為out.csv 輸出如下:

  path filename  signature                          result
0  C:\    a.txt      12345                               0
1  D:\    b.txt     678910     found in '2.csv' at row [0]
2  C:\    c.txt     111213  found in '2.csv' at row [1, 4]

.csv -files如下所示。

首先1.csv

  path filename  signature
0  C:\    a.txt      12345
1  D:\    b.txt     678910
2  C:\    c.txt     111213

第二: 2.csv

  filename  signature
0    b.txt     678910
1    x.txt     111213
2    b.txt     777777
3    c.txt     999999
4    b.txt     111213

因此我可以查看2.csv是否存在多次簽名,並將其保存在哪里。

暫無
暫無

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

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