Python读取CSV中API URL发送GET请求无响应问题求助
问题排查与修复方案
嘿,我帮你梳理了下代码里的问题,这就是为啥终端没输出响应的原因,咱们一个个来解决:
代码里的核心问题
- 逻辑分支完全错位:你写的
elif resp.status_code == 200是和前面的if同级的,但resp变量是在if块里定义的,外面根本访问不到,而且这个判断逻辑也不对——应该在发送请求后立刻检查状态码,而不是放到外部分支里。 - 变量名重复+解析错误:
resp = json.loads(resp)这行完全写错了,你想解析的是请求返回的r的内容,但这里用了还没定义的resp当参数,应该是解析r.text或者直接用requests自带的r.json()方法。 - 输出位置错误:
print(resp.content)放在了错误的分支里,就算逻辑正常,也根本不会执行到。 - 缺少异常处理:比如CSV里某行列数不够、API URL无效、网络连不上、响应不是合法JSON这些情况,都会导致程序静默失败或者崩溃,你却没做任何捕获处理。
修复后的完整代码
import csv import requests import json # 替换成你实际的headers headers = {"User-Agent": "Your-Custom-User-Agent"} with open('xyz.csv', mode='r', newline='', encoding='utf-8') as csvFile: reader = csv.reader(csvFile) # 如果你的CSV有表头,取消下面这行注释跳过表头 # next(reader) # 给每行加上行号,方便定位问题 for row_num, col in enumerate(reader, start=1): try: # 先检查当前行是否有足够的列,避免索引越界 if len(col) < 10: print(f"第{row_num}行列数不足,跳过") continue # 处理列值的空白字符,避免因为空格导致条件不匹配 col2 = col[2].strip().upper() col9 = col[9].strip().upper() if col2 == "Y" and col9 == "Y": api_url = col[6].strip() print(f"正在请求第{row_num}行的API: {api_url}") # 发送请求,添加超时避免无限等待 r = requests.get(api_url, headers=headers, timeout=10) # 主动抛出HTTP错误(比如404、500) r.raise_for_status() # 直接解析JSON响应,比json.loads更简洁 resp = r.json() # 输出响应内容 print(f"第{row_num}行响应结果:\n{resp}\n") else: print(f"第{row_num}行不满足条件(col2={col2}, col9={col9}),跳过") # 捕获请求相关的异常(超时、连接失败、HTTP错误等) except requests.exceptions.RequestException as e: print(f"第{row_num}行请求失败: {str(e)}\n") # 捕获JSON解析失败的异常 except json.JSONDecodeError as e: print(f"第{row_num}行响应不是合法JSON: {str(e)}\n") # 捕获其他未知异常 except Exception as e: print(f"第{row_num}行发生未知错误: {str(e)}\n")
修复点说明
- 修正逻辑结构:把请求、状态码检查、输出都放到了条件满足的
if块内部,确保只有符合要求的行才会执行请求流程。 - 修复JSON解析:用
r.json()直接解析响应,requests会自动处理编码和格式问题,比手动调用json.loads更可靠。 - 添加边界检查:先判断行的列数是否足够,避免
col[2]或col[9]引发索引越界错误。 - 处理空白字符:用
.strip()去掉列值前后的空格,避免CSV里的Y(带空格)导致条件判断不成立。 - 添加异常捕获:覆盖了请求失败、JSON解析失败等常见场景,程序不会因为某一行出错就中断,还能输出明确的错误信息帮你排查。
- 行号标识:用
enumerate给每行加上行号,方便你快速定位哪一行出了问题。
内容的提问来源于stack exchange,提问作者Gkb
相关产品推荐
相关产品推荐

