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
这应该是一个简单的更改,但我无法理解
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)')}