如何基于多个条件删除csv文件中的行?

时间:2019-01-20 11:05:56

标签: python csv

我要读取CSV文件并根据类型 srcaddr dstaddr 这三个条件删除该CSV文件中的一行。

例如,如果我输入类似 first 的条件是'icmp' second 的条件是 '10 .0.0.1 '第三条件为“ 10.0.0.2” ,则只会删除该特定行。

我尝试使用此代码,但是它仅允许我仅根据一种条件进行删除,如何修改它以允许其基于多种条件进行删除?

DateTime

当我尝试使用和&或运算符时,它总是给我一个错误,指出列表索引超出范围。

DateTime startDateTime = new DateTime(date,TimeZone.getTimeZone("America/New_York"));

2 个答案:

答案 0 :(得分:1)

您可以使用逻辑运算符andor“链接”多个条件:

if row[0] != 'icmp' and row[1] != 'foo' and row[2] != 'bar':
  # do thing

这是更多示例和说明:

https://thomas-cokelaer.info/tutorials/python/boolean.html#boolean-examples

答案 1 :(得分:1)

您的数据中很可能有空行-它可能只是最后一行之后的\ n。它也被解析并且不包含任何元素,因此row是一个零长度列表-访问row[1]会使程序崩溃。

创建演示文件:

with open("firewall-policies-test.csv","w") as f:
     f.write("""type,srcaddr,dstadrr
 icmp,10.0.0.1,10.0.0.2
 tcp,10.0.0.1,10.0.0.2
 bla,10.0.0.3,10.0.0.4
""") # here is a line that does not hold 3 values - it holds nothing (== [])

修复:

import csv
import sys 

# dont write / read text as binary    
with open('firewall-policies-test.csv', "r") as f:
    data = list(csv.reader(f))

with open('firewall-policies-test.csv', "w") as f:
    writer = csv.writer(f)
    for row in data:
        if row: # only use non-empty lines (or use if len(row)>2)
            if row[0] != 'icmp' and row[1] != '10.0.0.1' and row[2] != '10.0.0.2':
                  writer.writerow(row)

测试:

with open("firewall-policies-test.csv","r") as f:
    print(f.read())

输出:

type,srcaddr,dstadrr
 bla,10.0.0.3,10.0.0.4

我使用的条件将删除包含任何一个条件的任何行-仅删除完全满足您所有条件的行:

            if not (row[0] == 'icmp' and row[1] == '10.0.0.1' and row[2] == '10.0.0.2'): 
                writer.writerow(row)