首页 > 其他分享 >读取bdict格式文件并转化为txt

读取bdict格式文件并转化为txt

时间:2024-10-12 20:17:49浏览次数:10  
标签:bdict lef self 格式文件 originfile txt buf contents size

bdict格式是百度输入法的词库文件,那么怎么看里面的内容呢? 这就需要用到bdict到txt的转化。

下载:百度输入法-词库列表-餐饮

比如下载“菜名大全” 文件名:dict_file_734_20111227170031_1.0.0.bdict

文件大小134924字节

转换代码参考这篇文档:【搜狗&百度词库】.bdict文件与.scel转txt_scel文件在线-CSDN博客

import struct
import binascii
 
class Baidu(object):
    def __init__(self, originfile):
        self.originfile = originfile
        self.lefile = originfile + '.le'
        self.txtfile = originfile[0:(originfile.__len__()-5)] + 'txt'
        self.buf = [b'0' for x in range(0,2)]
        self.listwords = [] 
    # 字节流大端转小端
    def be2le(self):
        of = open(self.originfile,'rb')
        lef = open(self.lefile, 'wb')
        contents = of.read()
        contents_size = contents.__len__()
        mo_size = (contents_size % 2)
        # 保证是偶数
        if mo_size > 0:
            contents_size += (2-mo_size)
            contents += contents + b'0000'
        # 大小端交换
        for i in range(0, contents_size, 2):
            self.buf[1] = contents[i]
            self.buf[0] = contents[i+1]
            le_bytes = struct.pack('2B', self.buf[0], self.buf[1])
            lef.write(le_bytes)
        print('写入成功转为小端的字节流')
        of.close()
        lef.close()
    def le2txt(self):
        lef = open(self.lefile, 'rb')
        txtf = open(self.txtfile, 'w')
        # 以字符串形式读取转成小端后的字节流,百度词典的起始位置为0x350
        le_bytes = lef.read().hex()[0x350:]
        i = 0
        while i<len(le_bytes):
            result = le_bytes[i:i+4]
            i+=4
            # 将所有字符解码成汉字,拼音或字符
            content = binascii.a2b_hex(result).decode('utf-16-be')
            # 判断汉字
            if '\u4e00' <= content <= '\u9fff':
                self.listwords.append(content)
            else:
                if self.listwords:
                    word = ''.join(self.listwords)
                    txtf.write(word + '\n')
                self.listwords = []
        print('写入txt成功')
        lef.close()
        txtf.close()
if __name__ == '__main__':
    path = '你的.bdict文件'
    bd = Baidu(path)
    bd.be2le()
    bd.le2txt()

略微修改了,提高了效率,降低了磁盘写操作频率,可以在命令行执行时跟需要转换的文件名:

import struct
import binascii
import sys

class Baidu(object):
    def __init__(self, originfile):
        self.originfile = originfile
        self.lefile = originfile + '.le'
        self.txtfile = originfile[0:(originfile.__len__()-5)] + 'txt'
        self.buf = [b'0' for x in range(0,2)]
        self.listwords = [] 
    # 字节流大端转小端
    def be2le(self):
        of = open(self.originfile,'rb')
        lef = open(self.lefile, 'wb')
        contents = of.read()
        contents_size = contents.__len__()
        mo_size = (contents_size % 2)
#         print("====mozie", mo_size)
        # 保证是偶数
        if mo_size > 0:
            contents_size += (2-mo_size)
            contents += contents + b'0000'
        mo_size = (contents_size % 2)
#         print("====mozie", mo_size)
        # 大小端交换
        tmp = b""
        for i in range(0, contents_size, 2):
            self.buf[1] = contents[i]
            self.buf[0] = contents[i+1]
            le_bytes = struct.pack('2B', self.buf[0], self.buf[1])
            tmp = tmp + le_bytes
        lef.write(tmp)
        print('写入成功转为小端的字节流')
        of.close()
        lef.close()
    def le2txt(self):
        lef = open(self.lefile, 'rb')
        txtf = open(self.txtfile, 'w')
        # 以字符串形式读取转成小端后的字节流,百度词典的起始位置为0x350
        le_bytes = lef.read().hex()[0x350:]
  
        print(f'====len bytes of lefile:{len(le_bytes)}')
        i = 0
        tmpword = ""
        while i<len(le_bytes):
            result = le_bytes[i:i+4]
            i+=4
            # 将所有字符解码成汉字,拼音或字符
            content = binascii.a2b_hex(result).decode('utf-16-be')
#             print(content)
            # 判断汉字
            if '\u4e00' <= content <= '\u9fff':
                self.listwords.append(content)
            else:
                if self.listwords:
                    word = ''.join(self.listwords)
                    # txtf.write(word + '\n')
                    word = word + '\n'
                    tmpword = tmpword + word
                self.listwords = []
        # print(tmpword)
        txtf.write(tmpword)
        print('写入txt成功')
        lef.close()
        txtf.close()
if __name__ == '__main__':
    try:
        file_path = sys.argv[1]
        path = file_path
    except  :
        path = '8food.bdict'
    bd = Baidu(path)
    bd.be2le()
    bd.le2txt()

存盘为bd.py文件 

执行转换

python bd.py

程序会自动读取8food.bdict文件,并转为8food.txt文件

也可以跟文件名,比如下载的8大菜系文件是 dict_file_734_20111227170031_1.0.0.bdict:

python bd.py dict_file_734_20111227170031_1.0.0.bdict

生成文件为dict_file_734_20111227170031_1.0.0.txt,内容为菜名:

阿胶炖肉

阿胶牛肉汤

阿胶养阴粥

阿胶养阴粥

安阳三熏

鹌鹑蛋烧稚

鹌鹑枸杞粥

鹌鹑枸杞粥

熬黄花鱼

八宝菠菜

这样百度输入法词库就转换为txt文件了!

标签:bdict,lef,self,格式文件,originfile,txt,buf,contents,size
From: https://blog.csdn.net/skywalk8163/article/details/142882183

相关文章

  • 2006-2023年上市公司社会责任报告、ESG报告文本(TXT)
    2006-2023年上市公司社会责任报告、ESG报告文本(TXT)1、时间:2006-2023年2、范围:A股上市公司3、样本量:14279份4、说明:上市公司社会责任报告是企业对外公布的一份关于其社会责任实践和成果的详细文件,涵盖环境保护、社会贡献和公司治理等方面的表现。通常包含公司在减少环境影响......
  • [20241006]跟踪library cache lock library cache pin使用gdb(补充测试3).txt
    [20241006]跟踪librarycachelocklibrarycachepin使用gdb(补充测试3).txt--//补充测试产生光标已经缓存的情况下,生成新子光标的调用librarycachelocklibrarycachepin的情况。1.环境:SCOTT@book01p>@ver2==============================PORT_STRING          ......
  • [20241009]oracle timestamp with time zone数据类型的存储.txt
    [20241009]oracletimestampwithtimezone数据类型的存储.txt--//放假前遇到的问题,开发在表中定义了几个timestampwithtimezone的数据类型,及时更正对方的错误,完全没有使用这样的数据--//类型。类似的问题我以前就遇到,比如全部应用程序的表凡是varchar2数据类型都被定义为nvar......
  • 调用sdapi/v1/txt2img接口,报错“Couldn‘t load custom C++ ops”
    后端启动stable_diffusion的api接口nohuppythonlaunch.py --use-cpuall--skip-torch-cuda-test   --api--api-log  --listen--server-name192.168.1.204>/home/third_party_app/llm/stable-diffusion-webui/logs/all.log2>&1 &服务接口http://192.168......
  • Python 高级编程:高效读取 txt 文件的技巧与实践
    在Python中,读取txt文件是一项常见的操作。以下将介绍一些高级的方法来实现这一功能:使用with语句自动管理文件资源withopen('file.txt','r')asfile:content=file.read()print(content)with语句可以确保在代码块执行完毕后,文件会被正确地关闭,避免了资源泄漏......
  • [20240930]关于共享池-表对象在库缓存探究2.txt
    [20240930]关于共享池-表对象在库缓存探究2.txt--//以前探究过sql语句在共享池存在父子游标,父游标存在堆0,子游标堆0,堆6,通过各种指针链接起来,--//父游标的堆0上保存了所有子游标的列表和各个子游标的句柄指针,子游标的堆6中保存了解析过的执行计划等解析信息。--//前几天测试表对象......
  • 如何用find找到所有24字节大小的txt文件并删除?
    在Linux中,可用一条命令解决:find.-name"XX*.txt"-size24c-typef-print-execrm-f{}\;这条命令的作用是在当前目录及其子目录下查找文件名以“XX”开头、文件大小为24字节、文件类型为普通文件的“.txt”文件,并将查找到的文件打印出来,然后执行删除操作。以下是对命令中......
  • SSM电子资源管理系统602nm 可上传预览MP3/MP4格式文件
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,数据库名称,资源上传,资源列表,资源标引,编目检查,数据库,资源检索,系统日志开题报告内容一、研究背景随着信息技术的迅速发展和互联网的普及,电......
  • robots.txt写法大全和robots.txt语法的作用
    robots.txt 是一种用于与搜索引擎对话的协议文件,它告诉搜索引擎的爬虫(也称为蜘蛛或机器人)哪些页面或者文件是可以被抓取的,哪些是不可以被抓取的。这对于网站管理员来说非常重要,因为它可以帮助控制搜索引擎如何索引网站的内容。robots.txt 文件的基本语法:User-agent:定义规......
  • CANape、MF4格式文件和DBC文件之间的关系
    CANape、MF4格式文件和DBC文件之间的关系1.CANapeCANape是由VectorInformatik公司开发的一款功能强大的ECU(电子控制单元)开发工具。它主要用于:测量(Measurement):实时获取ECU和车辆网络中的数据。校准(Calibration):调整ECU内部的参数,以优化车辆性能。诊断(Diagnost......