跳转至

文件解析器

通达信服务器上除了行情,还有一批静态文件:板块成分、行业分类、历史专业财报。 这些文件是自定义二进制格式,本项目把解析器独立成 pytdxdata.codec 子模块:

  • 纯标准库(struct / zipfile),可以脱网单测
  • 与网络层解耦,可以直接拿本地文件字节调用
  • 每个解析函数的 docstring 里都写明了字节格式,方便对照排错
from pytdxdata.codec import parse_block_dat, parse_tdxhy_cfg, parse_financial_dat

blocks = parse_block_dat(open("block_gn.dat", "rb").read(), "block_gn.dat")

三类文件

文件 解析函数 产出 说明
block_zs/gn/fg.dat parse_block_dat list[TdxBlock] 板块成分股代码列表
tdxhy.cfg parse_tdxhy_cfg dict[str, IndustryInfo] 通达信行业 + 申万行业
gpcw.txt parse_financial_file_list list[FinancialFileInfo] 财报文件索引(文件名 / MD5 / 大小)
gpcw*.zip 内 .dat parse_financial_dat list[FinancialRecord] 每股历史财报原始字段

走网络时用 TdxData 的解析方法

如果不想自己管下载,直接用封装好的方法(内部就是调这些解析器):

get_block_parsed() / get_industry_map() / get_financial_file_infos() / get_financial_records_parsed() — 见 完整接口清单 → 除权 / 财务 / F10 / 文件。

关键细节

板块类型由文件名推断,因为文件头里没有可靠的分类字段:

文件名包含 category
zs 0 行业
gn 2 概念
fg 3 风格
其他 0

单条板块记录最多 400 只成分股(代码区 2800 字节 ÷ 每只 7 字节)。

财报报告期的来源优先级:文件名 → .dat 头部内嵌值。两个都拿不到才为空。

市场字段:0 = 深,1 = 沪。

这里曾经有过一个 bug——上游实现用 <6s1c1L 导致市场字段恒判为深市, 本包用 <6sBL 修正。见 更新日志。

API

服务器文件解析器:板块(.dat) / 行业(.cfg) / 历史专业财报(.zip+.dat)。

均为纯标准库实现(struct / zipfile),无第三方依赖,可独立单测。

函数:

infer_block_category

infer_block_category(filename: str) -> int

按文件名推断板块分类:zs=行业(0) / gn=概念(2) / fg=风格(3)。

parse_block_dat

parse_block_dat(
    data: bytes, filename: str = ""
) -> list[TdxBlock]

解析通达信 .dat 板块文件字节内容。

参数:

  • data (bytes) –

    文件完整字节。

  • filename (str, 默认: '' ) –

    用于推断 category(如 block_gn.dat)。

返回:

  • list[TdxBlock] –

    TdxBlock 列表;数据不足或为空时返回空列表。

parse_financial_dat

parse_financial_dat(
    data: bytes, report_date: int = 0
) -> list[FinancialRecord]

解析 gpcw .dat 二进制(zip 内的或服务器直接给的未压缩形式都行)。

参数:

  • data (bytes) –

    .dat 文件完整字节。

  • report_date (int, 默认: 0 ) –

    报告期 YYYYMMDD;传 0 时使用 header 内嵌的报告期。

返回:

  • list[FinancialRecord] –

    FinancialRecord 列表;数据不足或字段非法时返回空列表。

parse_financial_file_list

parse_financial_file_list(
    data: bytes,
) -> list[FinancialFileInfo]

解析 tdxfin/gpcw.txt 内容(每行 filename,md5hash,filesize)。

parse_tdxhy_cfg

parse_tdxhy_cfg(content: bytes) -> dict[str, IndustryInfo]

解析 tdxhy.cfg 字节内容。

参数:

  • content (bytes) –

    文件完整字节(GBK 编码)。

返回:

  • dict[str, IndustryInfo] –

    {6位代码: IndustryInfo};空输入或非法行会被跳过。

pack_payload

pack_payload(obj: Any) -> bytes

序列化缓存载荷(压缩)。

unpack_payload

unpack_payload(data: bytes) -> Any

反序列化缓存载荷。

下一步