Python读取CSV转列表跳过指定行 调用Twilio发送短信异常排查
问题排查方向
- 核心诱因是字段类型/空值问题:pandas读取CSV时默认会把空单元格识别为float类型的
NaN,当你用+拼接字符串和NaN时会直接触发TypeError: can only concatenate str (not "float") to str,整个循环在第一条数据就直接中断,自然不会发出任何短信。你删掉body里的拼接变量后,body是固定纯字符串,不存在类型冲突,所以能正常触发发送逻辑。 - 手机号匹配逻辑存在类型漏洞:你用
n =='8001234567'做跳过判断,如果Numbers列被pandas识别为数值类型,这个判断永远不会生效,同时数值类型的手机号还可能出现科学计数法、末尾精度丢失的问题,传给Twilio后会直接返回号码格式错误。 - 缺少异常捕获和日志:你当前代码没有任何错误捕获和打印逻辑,只要某条数据触发报错,整个脚本直接终止,新手很容易忽略控制台抛出的错误信息,误以为是代码无响应。
- 号码格式不符合Twilio要求:Twilio只认带
+国家码的E.164格式号码,你代码里的号码是纯数字格式,即使拼接没问题,也会因为号码格式非法被Twilio拒绝。
修正后代码
import time import pandas as pd from twilio.rest import Client # 提前初始化Twilio客户端、发信号码,发信号码同样要带+国家码前缀 twilio_client = Client("你的ACCOUNT_SID", "你的AUTH_TOKEN") my_number = "你的Twilio发信号码,例:+18001234567" # 读CSV时强制所有列按字符串读取,空值转为空白字符串,从根源避免类型拼接错误 columns = pd.read_csv("你的CSV文件路径", dtype=str, keep_default_na=False) # 对所有字段做去空格处理,避免CSV里自带的多余空格、换行符导致异常 phone_number = columns['Numbers'].str.strip().tolist() last_name = columns['Name'].str.strip().tolist() link = columns['Link'].str.strip().tolist() def send_message(num, lname, lk): # 给手机号补E.164格式国家码,根据你发送的号码归属地替换前缀,国内号码用+86 format_num = num if num.startswith("+") else f"+1{num}" # 用f-string做字符串拼接,比+拼接兼容性更好 message = twilio_client.messages.create( body= f'Hi {lname},\n\n This is a test. Heres a link: {lk}', from_= my_number, to= format_num ) print(f"发送成功:接收人{lname},号码{format_num},消息ID{message.sid}") for (n, ln, lk) in zip(phone_number, last_name, link): # 统一转字符串去空格后再比对要跳过的号码,避免类型不匹配导致跳过逻辑失效 if str(n).strip() == '8001234567': print(f"跳过指定号码:{n}") continue # 跳过缺手机号、姓名、链接的无效行 if not all([n, ln, lk]): print(f"跳过无效数据行:手机号{n},姓名{ln},链接{lk}") continue time.sleep(5) # 加异常捕获,单条发送失败不中断整个循环,同时打印错误原因方便排查 try: send_message(num=n, lname=ln, lk=lk) except Exception as e: print(f"向{n}发送失败,错误信息:{str(e)}")
注意事项
- 禁止使用
from pandas import *的通配符导入方式,容易出现变量名冲突,代码可维护性极差。 - 调试阶段先拿1-2条测试数据验证逻辑,不要直接跑全量数据,避免触发Twilio限流或者发错消息。
- 如果CSV里的链接带特殊字符、换行符,要提前做转义处理,否则可能触发Twilio的内容拦截规则。
内容的提问来源于stack exchange,提问作者user17244616
相关产品推荐
相关产品推荐

