处理blocked_sites表与items.csv匹配排除逻辑时触发TypeError报错
解决
TypeError: first argument must be string or compiled pattern 错误 这个错误的根源很明确:你调用 re.search(row[0], row1[19]) 时,第一个参数 row[0](从blocked_sites表读取的第0列值)不是字符串或编译好的正则表达式对象,可能是整数、None或者其他非字符串类型,违反了re.search()的参数要求。
核心解决方案
我们可以从两个方向修复这个问题,取决于你是否真的需要正则匹配:
方案1:用简单的存在性检查替代正则(推荐)
如果你只是想判断blocked_sites的第0列值是否出现在CSV的第19/26字段中,完全不需要正则,用Python的in操作符更高效,还能避免类型问题。
下面是完整的实现代码:
import csv # 根据你的数据库类型替换,比如mysql-connector、psycopg2等 import sqlite3 # 第一步:从数据库读取blocked_sites的第0列,转成字符串集合(加速查找) blocked_strings = set() db_conn = sqlite3.connect("your_database.db") # 替换为你的数据库连接方式 cursor = db_conn.cursor() cursor.execute("SELECT * FROM blocked_sites") for row in cursor.fetchall(): # 处理可能的空值,统一转成字符串 blocked_val = str(row[0]) if row[0] is not None else "" blocked_strings.add(blocked_val) db_conn.close() # 第二步:处理CSV,排除匹配的行 with open("items.csv", "r", newline="", encoding="utf-8") as in_csv, \ open("filtered_items.csv", "w", newline="", encoding="utf-8") as out_csv: reader = csv.reader(in_csv) writer = csv.writer(out_csv) # 写入CSV表头(如果你的CSV有表头的话) header = next(reader) writer.writerow(header) for csv_row in reader: # 确保CSV的目标字段是字符串,同时处理行长度不足的情况 field_19 = str(csv_row[19]) if len(csv_row) > 19 else "" field_26 = str(csv_row[26]) if len(csv_row) > 26 else "" # 判断是否需要排除该行 need_exclude = False for val in blocked_strings: if val in field_19 or val in field_26: need_exclude = True break if not need_exclude: writer.writerow(csv_row)
方案2:如果你确实需要正则匹配
如果你的需求是模糊匹配(比如用通配符、正则规则),那必须确保传入re.search()的第一个参数是字符串或编译好的正则对象:
import re # (前面数据库读取部分和方案1一致,确保blocked_val是字符串) for csv_row in reader: field_19 = str(csv_row[19]) if len(csv_row) > 19 else "" field_26 = str(csv_row[26]) if len(csv_row) > 26 else "" need_exclude = False for val in blocked_strings: # 可选:预编译正则提升效率 pattern = re.compile(val) if pattern.search(field_19) or pattern.search(field_26): need_exclude = True break if not need_exclude: writer.writerow(csv_row)
额外注意事项
- 确认CSV的索引:Python的
csv.reader返回的行是从0开始索引的,所以第19字段对应csv_row[19](也就是Excel里的第20列),别搞混了。 - 处理空值/缺失字段:有些CSV行可能长度不足,所以要先判断
len(csv_row) > 19再访问,避免索引越界错误。
内容的提问来源于stack exchange,提问作者Deba
相关产品推荐
相关产品推荐

