[英]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.DictReader
和csv.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.csv
和2.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.