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的商标信息查询api调用代码实例

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

  3. python输入汉字的代码_基于python的汉字转GBK码实现代码

    如图,"广"的编码为%B9%E3,暂且把%B9称为节编码,%E3为字符编码(第二编码). 思路: 从GBK编码页面收集汉字 http://ff.163.com/newflyff/g ...

  4. 基于python爬虫技术的应用_基于Python爬虫技术的应用

    办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...

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

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

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

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

  7. python登录界面源码_基于Python的自媒体小助手---登录页面的实现代码

    核心技术:Python3.7 GUI技术:Tkinter (Python已经内置) 好多文章写Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 我看了N遍也没够好多东西都没有就基 ...

  8. 基于python的音频播放器_基于python实现音乐播放器代码实例

    基于python实现音乐播放器代码实例,一首,函数,按钮,布局,音乐 基于python实现音乐播放器代码实例 易采站长站,站长之家为您整理了基于python实现音乐播放器代码实例的相关内容. 核心播放 ...

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

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

最新文章

  1. (六)java多线程之ReadWriteLock
  2. python的数组和元组区别_python中数组,列表,元组的区别、定义、功能
  3. 用GPU拯救世界:英伟达斯坦福呼吁玩家捐献算力,投入新冠病毒相关蛋白质分布式计算...
  4. Oracle之分页查询
  5. 怎么测试本地网页在不同分辨率下电脑显示效果_干货:微信小程序测试过程中的各个要点...
  6. 洞悉物联网发展1000问之物联网会产生哪些独角兽?机会在哪里?
  7. SpringBoot整合Security安全框架、控制权限
  8. 脚本必须位于html的,js 前端第三剑客
  9. 微信开发学习日记(一):快速阅读5本书,掌握整体背景
  10. 求递推序列的第N项(51Nod-1126)
  11. Python GIL 系列之再谈Python的GIL
  12. sql server 2005练习集(基础)
  13. 监控三剑客<cacti、nagios、zabbix>
  14. 使用kubeadm安装部署k8s
  15. win10易升_易升win10失败怎么办
  16. nutch 抓取流程解析
  17. linux系统编程界面,App主界面比较 - Android学习系列_Linux编程_Linux公社-Linux系统门户网站...
  18. Spring07 Java配置
  19. 【DevOps实战|基于Jenkins与Gitlab构建企业级持续集成环境系统】(Jenkins+Gitlab+Keepalived+Haproxy+Sonarqube+Http+灰度自动部署)
  20. 世上没有免费午餐:谈谈网络广告与节操

热门文章

  1. c# 如何编写CRC校验算法
  2. 汇编学习笔记——汇编指令
  3. hp服务器bios如何改高性能,HPE ProLiant DL380 Gen10 不同BIOS设置内存性能测试
  4. Linux下安装jboss-5.1.0.GA
  5. 鸿蒙大陆鸿蒙战凯,鸿蒙大陆10.2
  6. 数据中心机房新风送风状态点的分析
  7. C++多态的实现机制
  8. suid提权全解(超细)
  9. 2017年第八届蓝桥杯省赛题目python解答(更新中)
  10. netmeeting共享桌面自动启动