如何从 input.txt 文件读取参数并传递给 Python HTTP 请求

9次阅读

如何从 input.txt 文件读取参数并传递给 Python HTTP 请求

本文介绍如何将 input.txt 中定义的键值对(支持纯文本格式与标准 json 格式)安全、灵活地解析为字典,并作为 `params` 传入 `requests.get()`,同时处理常见格式异常与 编码 问题。

在实际开发中,将请求参数外置到配置文件(如 input.txt)是提升代码可维护性与环境适配性的常用做法。但需注意:原始示例中的 input.txt 并非标准 JSON,而是类查询字符串格式(key=value,key=value),而答案中给出的 JSON 格式虽更规范,却与原始文件内容不一致。因此,一个健壮的解决方案应 同时兼容两种常见格式,并具备错误处理能力。

✅ 推荐方案:优先尝试 JSON,降级解析键值对

import json import requests from urllib.parse import parse_qsl from pathlib import Path  def load_params(file_path: str) -> dict:     """安全加载参数:先尝试 JSON,失败则按 key=value 格式解析"""     p = Path(file_path)     if not p.exists():         raise FileNotFoundError(f"参数文件未找到: {file_path}")      try:         # 尝试解析为标准 JSON(推荐:input.txt 内容为合法 JSON 对象)with open(p, "r", encoding="utf-8") as f:             return json.load(f)     except json.JSONDecodeError:         # 降级处理:按逗号分隔 + 等号分割(兼容原始 input.txt 格式)with open(p, "r", encoding="utf-8") as f:             content = f.read().strip()         if not content:             return {}         # 支持形如 "term=……,country=……,action=……" 的单行格式         pairs = [pair.strip() for pair in content.split(",")]         params = {}         for pair in pairs:             if "=" in pair:                 k, v = pair.split("=", 1)  # 只分割第一个等号,避免值中含 = 时出错                 params[k.strip()] = v.strip().strip('"'')  # 去除可能的引号         return params  # 使用示例 api_url ="https://lei-registrations.in/wp/wp-admin/admin-ajax.php"input_file_path ="input.txt"params = load_params(input_file_path)  headers = {"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0"}  try:     response = requests.get(api_url, params=params, headers=headers, timeout=10)     response.raise_for_status()     data = response.json()      if data.get("success"):         from bs4 import BeautifulSoup         soup = BeautifulSoup(data["data"],"html.parser")         for r in soup.select(".searchResults_title"):             name = r.select_one(".searchResults_name")             number = r.select_one(".searchResults_number")             if name and number:                 print(f"{name.text.strip():<50} {number.text.strip()}")     else:         print("API 返回失败:", data.get("message"," 未知错误 "))  except requests.exceptions.RequestException as e:     print(" 网络请求异常:", e) except Exception as e:     print(" 解析或处理异常:", e)

⚠️ 注意事项与最佳实践

  • 文件编码 :始终显式指定 encoding="utf-8",避免 Windows/Linux 换行符或 中文乱码 问题;
  • JSON 更推荐:将 input.txt 改为 params.json 并使用标准 JSON 格式(如答案所示),语义清晰、易校验、天然支持嵌套与特殊字符;
  • 安全性:切勿用 eval() 或 exec() 解析任意文本——本方案仅使用 json.load() 和安全的字符串分割;
  • 空格与引号:原始格式中值可能带引号(如 "IN"),解析时应自动剥离;
  • 健壮性:添加 Path.exists() 检查、timeout、raise_for_status() 和异常分类捕获,确保脚本在生产环境中稳定运行。

通过该方案,你既能无缝迁移旧格式,又能平滑升级至更规范的 JSON 配置方式,兼顾兼容性与可维护性。

text=ZqhQzanResources