
使用csv.reader读取单列csv时,每行默认返回字符串列表(如['serial1']),直接赋值给json字段会导致格式错误;应提取首元素row[0]或用next()解包。
使用csv.reader读取单列csv时,每行默认返回字符串列表(如['serial1']),直接赋值给json字段会导致格式错误;应提取首元素row[0]或用next()解包。
当你用 csv.reader 读取形如以下结构的 CSV 文件:
serial1 serial2 serial3
尽管每行只有一个值,csv.reader 仍会将每一行解析为一个字符串列表(例如 ['serial1']),而非纯字符串 'serial1'。因此,你代码中 data = {"sn": row} 实际发送的是:
{"sn": ["serial1"]} # ❌ 错误:sn 是列表,非预期字符串而非期望的:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
{"sn": "serial1"} # ✅ 正确:sn 是字符串✅ 正确写法:提取单列值
方法 1:索引取值(推荐,清晰直观)
import csv
import requests
url = "https://api.example.com/warranty"
with open('serials.csv', mode='r', newline='') as infile:
reader = csv.reader(infile)
serials = [row[0] for row in reader] # ← 关键:取每行第一个元素
for sn in serials:
data = {"sn": sn} # sn 是 str,非 list
response = requests.post(url, json=data)
if response.status_code == 200:
warranty_info = response.json()
expire_date = warranty_info.get('warrantyInfo', {}).get('warrantyExpireDate')
print(f"{sn}: {expire_date}")
else:
print(f"{sn}: Failed to retrieve")方法 2:解包单元素行(适用于严格单列)
serials = [next(iter(row)) for row in reader] # 等价于 row[0],更函数式 # 或更安全地: serials = [row[0] if row else None for row in reader]
方法 3:使用 csv.DictReader(适合带标题的CSV)
若 CSV 含列名(如 sn),可更语义化:
立即学习“Python免费学习笔记(深入)”;
sn serial1 serial2
with open('serials.csv') as f:
reader = csv.DictReader(f)
serials = [row['sn'] for row in reader] # 直接按字段名取值⚠️ 注意事项
-
csv.reader总是返回list[str],无论列数多少——这是其设计行为,不是 bug; - 若 CSV 可能含空行,建议添加过滤:
[row[0].strip() for row in reader if row and row[0].strip()]; - 使用
newline=''参数打开文件(如示例所示),避免跨平台换行符问题; - 生产环境建议添加异常处理(如
requests.exceptions.RequestException)和超时设置。
✅ 总结
根本原因在于混淆了「行数据结构」与「业务字段语义」:csv.reader 返回的是“行”,不是“值”。只需一步解包(row[0])即可获得所需字符串,无需额外转换或正则处理。保持数据流清晰——读取 → 提取 → 构造 payload —— 是构建健壮 CSV API 集成的关键。

















