编辑代码以根据条件创建过滤器,然后剥离条件

时间:2013-11-25 19:45:54

标签: python python-2.7 csv

SO,

我正在寻找一些帮助来制作一些代码,以便它还包含一个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

这应该是一个简单的改变,但我无法弄明白

1 个答案:

答案 0 :(得分:3)

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