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

Python 如何基于多个条件删除csv文件中的行?,python,csv,Python,Csv,我想读取一个CSV文件并根据三个条件删除该CSV文件中的一行,键入,srcadr,dstaddr 因此,例如,如果我输入类似于第一个条件是'icmp',第二个条件是'10.0.0.1',第三个条件是'10.0.0.2',它只会删除该行 我已尝试使用此代码,但它只允许我基于一个条件进行删除,如何修改它以允许它基于多个条件进行删除 #code that I used to delete a row in CSV file based on only one condition. import cs

我想读取一个CSV文件并根据三个条件删除该CSV文件中的一行,键入srcadrdstaddr

因此,例如,如果我输入类似于第一个条件是'icmp'第二个条件是'10.0.0.1'第三个条件是'10.0.0.2',它只会删除该行

我已尝试使用此代码,但它只允许我基于一个条件进行删除,如何修改它以允许它基于多个条件进行删除

#code that I used to delete a row in CSV file based on only one condition.

import csv
import sys


with open('firewall-policies-test.csv', "rb") as f:
    data = list(csv.reader(f))

with open('firewall-policies-test.csv', "wb") as f:
    writer = csv.writer(f)
    for row in data:
        if row[0] != 'icmp':
              writer.writerow(row)   






 #code for CSV File
 type,srcaddr,dstadrr
 icmp,10.0.0.1,10.0.0.2
 tcp,10.0.0.1,10.0.0.2
当我试图使用and&or运算符时,它总是给我一个错误,说列表索引超出范围

Traceback (most recent call last):
  File "deletecsv.py", line 11, in <module>
    if row[0] != "icmp" and row[1] != '10.0.0.1' and row[2] != '10.0.0.2':
IndexError: list index out of range
回溯(最近一次呼叫最后一次):
文件“deletecsv.py”,第11行,在
如果行[0]!=“icmp”和第[1]行!='10.0.0.1'和第[2]行!='10.0.0.2':
索引器:列表索引超出范围
您可以使用逻辑运算符
来“链接”多个条件:

if row[0] != 'icmp' and row[1] != 'foo' and row[2] != 'bar':
  # do thing
以下是更多的示例和说明:


您的数据中很可能有空行-可能只是最后一行后面的一个\n。它也会被解析,并且不包含任何元素,因此
是一个零长度列表-访问
行[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 (== [])
修正:

测试:

输出:

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)

使用逻辑运算符如
(必须满足所有条件)或
(满足任何条件)如何?否,它会返回一个错误,表示列表索引超出范围…嗨,很抱歉,我已编辑以显示遇到的错误消息。嗨,感谢您的快速回复,但我不知道为什么它总是给出一个错误,说列表索引超出范围。在我的示例中,我使用索引1、2和3访问行值。如果某些行没有这些索引的值,例如该行只有2个值(长度2),则无法访问
行[2]
。您可以添加一个附加检查,检查该行是否包含所有值,例如
如果len(row)>=2和…
忽略缺少值的行。您的答案也是正确的,也感谢您的帮助!你完全正确!天哪,我太蠢了,因为我没有检查前面是否有空行,我认为代码有一些问题,于是花了整个下午的时间来修复它。非常感谢您的详细解释和帮助!
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)