以下是解析通达信dat(日线数据文件)与blk(板块数据文件)的Python实现方案,包含完整源码及注释:
1. DAT文件解析(日线数据)
通达信日线数据文件(.dat)采用二进制格式存储,结构如下:
- 文件路径:TdxDir/data/sh|sz#lday/*.dat
- 数据结构:
- 每32字节为一条记录
- 字段顺序:日期(4字节)、开盘价(4字节)、最高价(4字节)、最低价(4字节)、收盘价(4字节)、成交量(4字节)、成交额(4字节)、保留字段(4字节)
解析代码:
import struct
import os
def parse_dat_file(file_path):
records = []
with open(file_path, 'rb') as f:
while True:
chunk = f.read(32) # 每条记录32字节
if not chunk:
break
# 解包二进制数据(I表示4字节无符号整数)
date, open_price, high, low, close, volume, turnover, _ = struct.unpack('IIIIIIII', chunk)
records.append({
'date': date, # 日期(格式:YYYYMMDD)
'open': open_price / 1000.0, # 开盘价(需除以1000)
'high': high / 1000.0,
'low': low / 1000.0,
'close': close / 1000.0,
'volume': volume, # 成交量(股)
'turnover': turnover # 成交额(元)
})
return records
# 示例:解析上海市场股票600000的日线数据
data = parse_dat_file(r'C:\\通达信\\data\\sh#lday\\sh600000.dat')
print(data[:2]) # 打印前两条记录
2. BLK文件解析(板块数据)
.blk文件存储板块包含的股票代码列表,格式为纯文本:
- 文件路径:TdxDir/blocknew/*.blk
- 数据结构:每行一个股票代码(如sh600000)
解析代码:
def parse_blk_file(file_path):
stock_codes = []
with open(file_path, 'r', encoding='gbk') as f: # 注意编码可能为GBK
for line in f.readlines():
code = line.strip() # 去除换行符和空格
if code:
stock_codes.append(code)
return stock_codes
# 示例:解析"自选股1"板块
block_stocks = parse_blk_file(r'C:\\通达信\\blocknew\\自选股1.blk')
print(block_stocks) # 输出板块内所有股票代码
3. 关键注意事项
文件路径适配:
- 根据实际安装路径修改TdxDir(如C:\\通达信)
- 市场标识:sh(沪市)、sz(深市)
数据精度处理:
- 价格字段需除以1000(如开盘价=123456表示123.456元)
错误处理扩展:
try:
data = parse_dat_file('path/to/file.dat')
except FileNotFoundError:
print("文件不存在!")
except struct.error:
print("二进制解析错误!")
4. 完整源码整合
import struct
import os
def parse_dat_file(file_path):
records = []
try:
with open(file_path, 'rb') as f:
while True:
chunk = f.read(32)
if not chunk:
break
# 使用try-except避免异常数据中断
try:
date, open_price, high, low, close, volume, turnover, _ = struct.unpack('IIIIIIII', chunk)
records.append({
'date': date,
'open': open_price / 1000.0,
'high': high / 1000.0,
'low': low / 1000.0,
'close': close / 1000.0,
'volume': volume,
'turnover': turnover
})
except struct.error:
continue
except Exception as e:
print(f"解析DAT文件出错: {e}")
return records
def parse_blk_file(file_path):
stock_codes = []
try:
with open(file_path, 'r', encoding='gbk') as f:
for line in f:
code = line.strip()
if code:
stock_codes.append(code)
except Exception as e:
print(f"解析BLK文件出错: {e}")
return stock_codes
5. 应用场景
- 日线数据分析:计算技术指标(如均线、MACD)
- 板块监控:实时跟踪特定板块的股票表现
- 数据备份:将二进制数据转换为CSV/数据库存储
通过上述代码,可高效提取通达信本地数据,为量化交易策略提供底层支持。

