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

Python处理CSV调用API报TypeError字符串拼接错误如何解决

报错原因

触发该报错的核心问题有两个:

  • csv.reader 遍历返回的每一行都是列表类型,你代码里直接用q(列表)和字符串拼接,就触发了类型错误
  • 你读取输入CSV的写法存在逻辑错误:item是传入的CSV文件名字符串,list(item)会把文件名拆成单个字符的列表,csv.reader读这个列表根本拿不到你需要的查询词数据

最简修复方案

只需要调整读取CSV和遍历的部分,不用改动太多原有逻辑:

  1. 把原来的query_list = csv.reader(list(item))替换成读取输入CSV的正确代码,直接把所有查询词读成字符串列表
  2. 遍历的时候直接拿字符串类型的查询词,即可解决列表拼接报错的问题

修改后的核心代码段:

import requests
import urllib.parse
import pandas as pd
import csv
import io

file_csv = "data_test.csv"

def get_data(item):
    domain_1 = "domain1.com" #@param {type:"string"}
    domain_2 = "domain2.com" #@param {type:"string"}

    domain_list = [domain_1,domain_2]

    query_base =  "https://api.semrush.com/?type=domain_organic&key=[API_KEY]&display_limit=1&export_columns=Ph,Po,Nq,Cp,Ur&display_sort=tr_desc&database=us"
    query_base_list = []

    for d in domain_list:
        builder = ""
        if d == "":
          continue
        else:
          builder += query_base
          if len(d.split(".")) == 3:
            builder += "&domain=" + d.split(".")[1]+"."+d.split(".")[2]
            builder += "&display_filter=%2B%7CUr%7CCo%7C" + d.split(".")[0] + "."
          else:
            builder += "&domain="+d
          query_base_list.append((d,builder))
    
    # 替换原来的CSV读取逻辑,把查询词读成字符串列表
    query_list = []
    with open(item, 'r', encoding='utf-8') as f:
        reader = csv.reader(f)
        for row in reader:
            if row: # 跳过空行
                query_list.append(row[0]) # 取每行第一个字段作为查询词

    with open('output.csv','w', encoding='utf-8') as f:
      f.write("Domain,Query,Ranking,Search Volume,CPC,URL\n")
      for d,r in query_base_list:
        for q in query_list: # 这里的q已经是字符串,不会触发拼接报错
          kw = urllib.parse.quote_plus(q)
          req = ""
          if len(d.split(".")) == 3:
            req = r + "%7C%2B%7CPh%7CEq%7C"+kw
          else:
            req = r + "&display_filter=%2B%7CPh%7CEq%7C"+kw
          response = requests.get(req)
          response_rows = response.text.split('\n')
          if len(response_rows) < 3:
            f.write(d + "," + q + ",101")
            kwdatacall = "https://api.semrush.com/?type=phrase_this&key=[API_KEY]&export_columns=Nq,Cp&database=us&phrase="+kw
            response = requests.get(kwdatacall)
            response_rows = response.text.split('\n')
            f.write(response_rows[1].replace(";",",")+",dnr\n")
          else:
            f.write(d + "," + response_rows[1].replace(";",",")+"\n")

    df = pd.read_csv('output.csv',sep=',')

get_data(file_csv)

优化建议

你代码中已经引入了pandas库,可以直接用pandas读取输入CSV,代码更简洁:

# 直接用pandas读输入CSV,假设CSV第一列是查询词,无表头
df_input = pd.read_csv(item, header=None)
query_list = df_input.iloc[:,0].dropna().astype(str).tolist()

如果后续查询词或者返回结果里包含逗号,手动拼接字符串写入CSV会导致列错位,更稳妥的写法是用csv.writer的writerow方法写入列表格式的行数据,不用手动处理分隔符。

内容的提问来源于stack exchange,提问作者Alex Fuss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:24:03