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

2024-10-02 00:41:46 发布

您现在位置:Python中文网/ 问答频道 /正文

所以

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

这应该是一个简单的改变,但我想不出来


Tags: csvno代码列表if语句testingupper
1条回答
网友
1楼 · 发布于 2024-10-02 00:41:46

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)')} 

相关问题 更多 >

    热门问题