Python处理CSV调用API报TypeError字符串拼接错误如何解决
报错原因
触发该报错的核心问题有两个:
csv.reader遍历返回的每一行都是列表类型,你代码里直接用q(列表)和字符串拼接,就触发了类型错误- 你读取输入CSV的写法存在逻辑错误:
item是传入的CSV文件名字符串,list(item)会把文件名拆成单个字符的列表,csv.reader读这个列表根本拿不到你需要的查询词数据
最简修复方案
只需要调整读取CSV和遍历的部分,不用改动太多原有逻辑:
- 把原来的
query_list = csv.reader(list(item))替换成读取输入CSV的正确代码,直接把所有查询词读成字符串列表 - 遍历的时候直接拿字符串类型的查询词,即可解决列表拼接报错的问题
修改后的核心代码段:
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
相关产品推荐
相关产品推荐

