You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:46:42