我要读取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"));
答案 0 :(得分:1)
您可以使用逻辑运算符and
或or
“链接”多个条件:
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)