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. Rocksdb 的 MergeOperator 简单使用记录
  2. 根据c语言数组定义填写下表,C语言程序设计 自测题(三)
  3. BSP场景管理方法简介
  4. 寻找最大的K个数(上)
  5. Linux——安装FTP服务器
  6. LeetCode 1403. 非递增顺序的最小子序列(排序)
  7. 计算机会计和传统手工会计的区别,手工会计与计算机会计之间的区别.doc
  8. c语言的开方程序,详细解析C语言中的开方实现
  9. 雨流计数法的matlab实现,采用三点法与四点法
  10. 区块链开源代码什么意思_区块链可以从开源中学到什么
  11. java string通配符_java通配符
  12. CCF试题 201903-2 二十四点解析
  13. 如何解决移动端 Retina 屏 1px 像素问题 ?
  14. 更适合运动的耳机,设计时尚轻巧好用,南卡Runner CC3上手
  15. 【记录】深度学习之蒸馏法训练网络
  16. 市北·GMIS 2019 全球数据智能峰会全记录
  17. 网络线缆连接器和线槽
  18. 菜鸟学算法——动态规划(二)
  19. B. Ela‘s Fitness and the Luxury Number codeforces 1737B
  20. 清华大学期末复习方法

热门文章

  1. 20201021 plecs提高波特图精度
  2. 编写统计选票的程序,设有三个候选人,有十人参加选举,每个选举人只能输入一个候选人姓名,要求输出各个候选人的票数
  3. 【FFmpeg】PCM编码成AAC
  4. 元胞自动机交通模型案例2
  5. Spring常用注解,以及注解的作用和简单用法
  6. Power Query M语言所有Number函数,分类汇总掌握
  7. Solidity语言开发基础教程
  8. 新的云威胁!黑客利用云技术窃取数据和源代码
  9. 如何获取Intel平台上网卡的最佳性能,网卡与内存、cpu统一numa
  10. beyond compare添加右键比较功能