import structimport os

# 搜狗的scel词库就是保存的文本的unicode编码,每两个字节一个字符(中文汉字或者英文字母)

# 找出其每部分的偏移位置即可

# 主要两部分

#1.全局拼音表,貌似是所有的拼音组合,字典序

# 格式为(index,len,pinyin)的列表

# index: 两个字节的整数 代表这个拼音的索引

# len: 两个字节的整数 拼音的字节长度

# pinyin: 当前的拼音,每个字符两个字节,总长len

#

#2.汉语词组表

# 格式为(same,py_table_len,py_table,{word_len,word,ext_len,ext})的一个列表

# same: 两个字节 整数 同音词数量

# py_table_len: 两个字节 整数

# py_table: 整数列表,每个整数两个字节,每个整数代表一个拼音的索引

#

# word_len:两个字节 整数 代表中文词组字节数长度

# word: 中文词组,每个中文汉字两个字节,总长度word_len

# ext_len: 两个字节 整数 代表扩展信息的长度,好像都是10

# ext: 扩展信息 前两个字节是一个整数(不知道是不是词频) 后八个字节全是0

#

# {word_len,word,ext_len,ext} 一共重复same次 同音词 相同拼音表

# 拼音表偏移,

startPy= 0x1540;

# 汉语词组表偏移

startChinese= 0x2628;

# 全局拼音表

GPy_Table={}

# 解析结果

# 元组(词频,拼音,中文词组)的列表

GTable=[]

# 原始字节码转为字符串

def byte2str(data):

pos= 0str= ''

while pos

c= chr(struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0])if c != chr(0):

str+=c

pos+= 2

returnstr

# 获取拼音表

def getPyTable(data):

data= data[4:]

pos= 0

while pos

index= struct.unpack('H', bytes([data[pos],data[pos + 1]]))[0]

pos+= 2lenPy= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]

pos+= 2py= byte2str(data[pos:pos +lenPy])

GPy_Table[index]=py

pos+=lenPy

# 获取一个词组的拼音

def getWordPy(data):

pos= 0ret= ''

while pos

index= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]

ret+=GPy_Table[index]

pos+= 2

returnret

# 读取中文表

def getChinese(data):

pos= 0

while pos

# 同音词数量

same= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]

# 拼音索引表长度

pos+= 2py_table_len= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]

# 拼音索引表

pos+= 2py= getWordPy(data[pos: pos +py_table_len])

# 中文词组

pos+=py_table_lenfor i inrange(same):

# 中文词组长度

c_len= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]

# 中文词组

pos+= 2word= byte2str(data[pos: pos +c_len])

# 扩展数据长度

pos+=c_len

ext_len= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]

# 词频

pos+= 2count= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]

# 保存

GTable.append((count, py, word))

# 到下个词的偏移位置

pos+=ext_len

def scel2txt(file_name):

print('-' * 60)

with open(file_name,'rb') asf:

data=f.read()

print("词库名:", byte2str(data[0x130:0x338])) # .encode('GB18030')

print("词库类型:", byte2str(data[0x338:0x540]))

print("描述信息:", byte2str(data[0x540:0xd40]))

print("词库示例:", byte2str(data[0xd40:startPy]))

getPyTable(data[startPy:startChinese])

getChinese(data[startChinese:])if __name__ == '__main__':

# scel所在文件夹路径

in_path= "E:\python_workspace"# 输出词典所在文件夹路径

out_path= "coal_dict.txt"fin= [fname for fname in os.listdir(in_path) if fname[-5:] == ".scel"]for f infin:

f=os.path.join(in_path, f)

scel2txt(f)

# 保存结果

with open(out_path,'w', encoding='utf8') asf:

f.writelines([word+'\n' for count, py, word in GTable])

python的成语接龙程序代码_基于Python经典版成语接龙逻辑实现相关推荐

  1. python名片打印程序代码_基于Python的名片识别接口调用代码实例

    #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib from urllib import urlencode #-------- ...

  2. python 运行程序代码_一些python程序

    <从问题到程序:用Python学编程和计算>--1.2 Python语言简介 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第1章,第1.2节,作者 ...

  3. python点名代码_基于python tkinter的点名小程序功能的实例代码

    基于python tkinter的点名小程序功能的实例代码,花名册,次数,窗口,未找到,初始化 基于python tkinter的点名小程序功能的实例代码 易采站长站,站长之家为您整理了基于pytho ...

  4. python利用pandas合并excel表格代码_利用Python pandas对Excel进行合并的方法示例

    前言 在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下. 博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大 ...

  5. 随机数写excel java代码_基于python实现在excel中读取与生成随机数写入excel中

    搜索热词 具体要求是:在一份已知的excel表格中读取学生的学号与姓名,再将这些数据放到新的excel表中的第一列与第二列,最后再生成随机数作为学生的考试成绩. 首先要用到的数据库有:xlwt,xlr ...

  6. python的坐标代码_基于Python的地图坐标服务接口调用代码实例

    代码描述:基于Python的地图坐标服务接口调用代码实例 关联数据:地图坐标服务 接口地址:http://www.juhe.cn/docs/api/id/32 #!/usr/bin/python # ...

  7. python三维重建代码_基于Python的三维重建开源代码

    [实例简介] 基于Python的三维重建开源代码,包括特征提取,SFM,PMVS以及CMVS等相关功能! [实例截图] [核心代码] sfm-bundler(python) └── sfm-bundl ...

  8. 编写python手机充值代码_基于Python的天聚人合加油卡充值接口调用代码实例

    一.接口申请开通 本代码是基于天聚人合的话费充值API实现的话费充值功能,使用前需要: 通过https://www.tianjurenhe.com/docs/api/?id=1申请开通话费接口服务. ...

  9. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

最新文章

  1. 远程桌面中Tab键不能补全的解决办法
  2. eclipse手动安装alibaba代码规范插件
  3. 嵌入式烤箱能不能放台面上_2021年开放式厨房怎么设计?先来做做嵌入式家电的功课吧!...
  4. Vue2 源码漫游(一)
  5. TCP/IP是如何实现可靠传输的
  6. 【Redis】redis cluster 添加 删除 重分配 节点
  7. WPF Rendering 2(硬件加速、软件加速)
  8. 天堂2服务器自动停止,为什么我一进天堂2就与服务器连接中断??/
  9. 【学习笔记】文献检索课程总结
  10. 数据结构与算法分析Java语言描述 第三版 课后习题 练习 答案
  11. NShape(开源矢量图形编辑器) 基本功能开发(一)
  12. 数据交换技术(*):电路交换,报文交换,分组交换的概念,特点和优缺点以及存储转发技术概念
  13. 何水无鱼?何山无石?何人无父?何女无夫?何树无枝?何城无市?
  14. Unity3D中Quaternion.Euler方法解析
  15. educoder算法设计与分析 实验一扩展 袋鼠过河问题
  16. PAT考试乙级1024(C语言实现)重点题目
  17. window下利用ip反查域名与利用域名查ip
  18. 经典动态规划:编辑距离
  19. MT6572,JB3,EMMC换nandflash问题!
  20. Typora 基本使用操作

热门文章

  1. html中submit和button的区别(总结)
  2. Linux高性能服务器编程——书籍阅读笔记
  3. Python test1
  4. 产品运营 跨境支付_精细化运营降低合规成本,收款易从亚马逊收款工具起步做完整跨境支付...
  5. 第三方支付和第四方支付有什么区别?
  6. 1637_fgets函数的功能
  7. 统计学,机器学习,数据挖掘,深度学习
  8. curl命令详解 (curl -I)
  9. VC知识库之应用控制
  10. Java TreeSet详解