2

我有两个 csv 文件,我正在使用一个 csv 从另一个 csv 搜索所有记录并更新其状态。我有两个表,并从 input.csv 中的搜索表中查找 IP 和 PROTOCOL。如果存在,则 EXISTS 列将更新为“否”。我被困在两个或多个记录的协议和 ip 相同的地方,但它们有不同的端口。它只更新一条记录。

import csv

IP, EXISTS, PROTOCOL = 'IP', 'Exists', 'Protocol'  # Field names referenced.

# Read entire input file into a list.
with open('input.csv', 'r', newline='') as inp:
    reader = csv.DictReader(inp)
    inputs = list(reader)

# Update input rows that match data in search.csv file.
with open('search.csv', 'r', newline='') as sea:
    sea_reader = csv.DictReader(sea)
    for row in sea_reader:
        protocol, ip = row[PROTOCOL], row[IP]
        for input_ in inputs:
            if input_[PROTOCOL] == protocol and input_[IP] == ip:  # Match?
                input_[EXISTS] = 'No'
                break

# Write updated input.csv data out into a file.
with open('input_updated.csv', 'w', newline='') as outp:
    fieldnames = inputs[0]
    writer = csv.DictWriter(outp, fieldnames)
    writer.writeheader()
    for input_ in inputs:
        writer.writerow(input_)

print('done')

输入.csv

姓名 知识产权 协议 港口 存在
l1 192.132.16.02 HTTP 80
l2 192.132.16.03 SSL 8443
l3 192.132.16.03 SSL 443
l4 192.132.16.04 SSL 443

搜索.csv

协议 知识产权 港口
1 HTTP 192.132.16.02 80
2 SSL 192.132.16.03 443
3 SSL 192.132.16.03 8443

在 search.csv 中有两条记录,它们具有相同的协议和 ip,但端口不同。结果,它只包括一条记录,而不是两者。我也尝试在条件下添加端口,但它不起作用

4

2 回答 2

0

您可以使用 pandas 读取 csv 文件。在两个文件的 IP、协议上创建索引。如果在 input_df 中找到 search_df 的索引,则迭代 search_df 并将值作为 True 插入 Exists 列。重置索引并删除 nan 值。


import pandas as pd
input_df = pd.read_csv("input.csv")
search_df = pd.read_csv("search.csv")
input_df = input_df.set_index(["IP","Protocol"])
search_df = search_df.set_index(["IP","Protocol"])
for index, _ in search_df.iterrows():
    input_df.loc[index,"Exists"] = True
input_df = input_df.reset_index()
input_df = input_df.dropna()

于 2021-08-31T07:41:42.363 回答
0

您的代码中唯一的问题是,break一旦找到匹配项,您就会退出循环,因此您将永远找不到更多匹配项。删除break它将使其工作,尽管它当然会更慢。

我不清楚一件事:端口号是否相关?在您的示例中,即使第三个搜索行不存在,第二个输入行也会匹配。因此,在匹配测试中包含端口号可能是个好主意:

with open('search.csv', 'r', newline='') as sea:
    sea_reader = csv.DictReader(sea)
    for row in sea_reader:
        protocol, ip, port = row[PROTOCOL], row[IP], row[PORT]
        for input_ in inputs:
            if input_[PROTOCOL] == protocol and input_[IP] == ip and input_[PORT] == port:  # Match?
                input_[EXISTS] = 'No'
                break

在这种情况下,break可以保留,因为您将只有完全匹配(即输入#2 和搜索#3,输入#3 和搜索#2)

于 2021-08-31T08:58:59.103 回答