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