fix: handle UTF-8 BOM in stock imports (#2333)

This commit is contained in:
s4kura
2026-09-13 16:48:59 +08:00
committed by GitHub
parent 089d9d26d6
commit 2ffe4e729e
4 changed files with 8 additions and 1 deletions

View File

@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
## [Unreleased]
- [测试] 修复股票名称解析冷启动超时并发测试的同步竞态:在放行后台抓取前确认两个等待者均已结束并返回空结果,避免 Docker 发布门禁偶发失败。
- [修复] 智能导入兼容带 UTF-8 BOM 的 CSV 与剪贴板文本,避免 `code` 表头被误当成数据并丢失有效股票代码。
<!-- 新条目格式:- [类型] 描述(类型取值:新功能/改进/修复/文档/测试/chore-->
<!-- 每条独立一行追加到本段末尾,无需分类标题,合并时冲突最小 -->

View File

@@ -1472,6 +1472,7 @@ LITELLM_FALLBACK_MODELS=anthropic/claude-sonnet-4-6,openai/gpt-5.4-mini
- **AkShare 名称解析缓存**:名称→代码解析使用 AkShare 在线 fallback 时,结果缓存 1 小时TTL避免频繁请求首次调用或缓存过期后会自动刷新。
- **CSV/Excel 列名**:支持 `code``股票代码``代码``name``股票名称``名称` 等(不区分大小写);无表头时默认第 1 列为代码、第 2 列为名称。
- **文本编码**CSV 与剪贴板文本支持 UTF-8含 BOM和 GBK。
- **常见解析失败**:文件过大(>2MB、编码非 UTF-8/GBK、Excel 工作表为空或损坏、CSV 分隔符/列数不一致时API 会返回具体错误提示。
- **模型优先级**`VISION_MODEL` > `LITELLM_MODEL` > 根据已有 API Key 推断(`OPENAI_VISION_MODEL` 已废弃,请改用 `VISION_MODEL`

View File

@@ -179,7 +179,7 @@ def parse_import_from_bytes(data: bytes, filename: Optional[str] = None) -> List
raise ValueError("仅支持 .xlsx 格式,请将 .xls 另存为 .xlsx 后重试")
# CSV / text
for encoding in ("utf-8", "gbk"):
for encoding in ("utf-8-sig", "gbk"):
try:
text = data.decode(encoding)
break

View File

@@ -39,6 +39,11 @@ class TestParseImportFromBytesCsv:
result = parse_import_from_bytes(data, "a.csv")
assert result[0] == ("600519", "贵州茅台", "medium")
def test_parses_utf8_bom_csv_header(self):
data = "\ufeffcode,name\n600519,".encode("utf-8")
result = parse_import_from_bytes(data, "a.csv")
assert result == [("600519", None, "medium")]
def test_parses_csv_no_header(self):
# Use 300750 instead of 00700 to avoid pandas stripping leading zeros
data = "600519,贵州茅台\n300750,宁德时代".encode("utf-8")