
本文详解如何通过 requests.get 正确获取服务器返回的 csv 数据(而非误解析为 json),包括设置正确请求头、处理响应内容、直接保存为 csv 文件的完整流程。
本文详解如何通过 requests.get 正确获取服务器返回的 csv 数据(而非误解析为 json),包括设置正确请求头、处理响应内容、直接保存为 csv 文件的完整流程。
在使用 requests.get 调用支持 CSV 输出的 API(如 Dynatrace v2 Metrics Query API)时,一个常见误区是:虽然服务端实际返回的是纯 CSV 文本(如 hostName,cpuUsage,timestamp),但开发者误调用 resp.json() —— 这会导致 JSONDecodeError 或静默解析失败,因为 CSV 不是合法 JSON 格式。
根本原因在于:API 返回的 Content-Type 决定了响应本质,而非客户端 Accept 头声明。您当前请求头中写的是 "Accepts": "text/csv,..."(拼写错误,应为 Accept),且即使头设置正确,若服务端仍返回 JSON(例如封装了 CSV 字符串的 JSON 对象),resp.text 才是原始 CSV 内容的正确入口。
✅ 正确做法分三步:
-
修正请求头:Accept 拼写必须正确,且优先指定 text/csv;同时建议显式设置 timeout 和错误处理:
Python 3.14.2下载Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
headers = { "Authorization": "API-Token XXX", "Accept": "text/csv" # 注意:是 Accept,不是 Accepts } -
直接读取响应文本,而非解析 JSON:
resp = requests.get(url11, headers=headers, timeout=30) resp.raise_for_status() # 抛出 HTTP 错误(如 401/404) # ✅ 关键:CSV 响应直接用 .text 获取原始字符串 csv_content = resp.text
-
安全保存为 CSV 文件(推荐方式,避免编码/换行问题):
with open("metrics_output.csv", "w", encoding="utf-8", newline="") as f: f.write(csv_content) print("CSV file saved successfully.")
⚠️ 注意事项:
- 若 API 实际返回的是 JSON 包裹 CSV(如 {"data": "host1,85.2,2024-11-11T00:10:00Z\nhost2,72.1,..."}),则需先 resp.json() 提取 data 字段,再写入文件;但根据您的描述(“print 出来是逗号分隔值”),应属前者——即服务端直出 CSV。
- 避免使用 csv.DictWriter 反向转换 JSON → CSV,除非响应结构明确为列表字典(此时原始 API 并未返回 CSV,而是 JSON)。本场景无需该逻辑。
- 务必检查 resp.headers.get("Content-Type") 确认是否为 text/csv,这是判断响应格式的唯一可靠依据。
总结:不要对 CSV 响应调用 .json();用 .text 获取原始内容,用标准文件写入保存即可。 正确设置 Accept: text/csv 头并验证服务端实际返回类型,是成功下载 CSV 的关键。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










