所以,

我正在寻找一些帮助,使它包含一些if语句,以便仅在该行包含(BIPL)时才添加过滤器,然后在添加后将其从过滤器列表中删除...

1test,tester,testing (BIPL),no,yes
2test,tester,testing,no,yes
3data,datas,datatest (BIPL),yes,no


当前代码...

with open('test.csv', 'rb') as old_csv:
    filters = {(row[0].lower(), row[1][:3].upper(), row[2].upper()) for row in csv.reader(old_csv, delimiter=',')}


有效的结果如下,只是格式不同。

1test,TES,TESTING
3data,DAT,DATATEST


这应该是一个简单的更改,但我无法弄清楚

最佳答案

csv.reader可以将迭代器作为其第一个参数(不仅仅是文件句柄)。因此,您可以定义一个生成器,该生成器仅产生包含'(BIPL)'的行并将其发送到csv.reader

import csv
import re

def only_bipl(f):
    for line in f:
        if '(BIPL)' in line:
            yield re.sub(r'\s*\(BIPL\)', '', line)

with open('test.csv', 'rb') as old_csv:
    reader = csv.reader(only_bipl(old_csv), delimiter=',')
    filters = {(row[0].lower(), row[1][:3].upper(), row[2].upper()) for row in reader}




请注意,上面的代码将产生任何在任何地方包含'(BIPL)'的行。更好,更有针对性的替代方法是仅匹配在第三项末尾包含'(BIPL)'的那些行。您可以在集合理解中使用if-clause来实现:

with open('test.csv', 'rb') as old_csv:
    reader = csv.reader(old_csv, delimiter=',')
    filters = {(row[0].lower(), row[1][:3].upper(), row[2][:-6].strip().upper())
               for row in reader
               if row[2].endswith('(BIPL)')}

08-24 13:45