术→技巧, 研发

Python读写MDict词典文件

钱魏Way · · 8 次浏览

MDX/MDD 文件格式简介

MDX和MDD是字典程序MDict使用的文件格式,其中MDX 文件用于存放定义,而MDD用于存放其他资源文件,比如图片,发音,虽然存放的内容是不一样的,但是两种文件的结构是一致的。

MDX 和 MDD 是两种常用于电子词典和参考书的文件格式,它们分别用于存储词典内容和多媒体数据。

使用场景

  • 电子词典软件:MDX 和 MDD 文件广泛应用于各种电子词典软件,如金山词霸、欧路词典等。
  • 移动设备:由于 MDX 和 MDD 文件体积较小且搜索效率高,非常适合在移动设备上使用。
  • 在线词典:一些在线词典网站也会使用 MDX 和 MDD 格式来存储和检索词典内容和多媒体数据。

工具与支持

  • 编辑工具:有一些专门的工具可以用来创建和编辑 MDX 和 MDD 文件,如 MDX Builder、Ecdict Studio 等。
  • 阅读器:许多电子词典软件和移动应用都支持 MDX 和 MDD 格式的词典文件,如欧路词典、灵格斯词霸等。
  • 转换工具:有些工具可以将其他格式的词典文件(如 XML、CSV)转换为 MDX 和 MDD 格式,如 MDX Converter。

MDX 格式

基本概念

  • MDX(Multilingual Dictionary eXtended)是一种用于存储词典内容的文件格式。
  • MDX 文件包含词条的文本内容及其对应的解释,支持多种语言和编码方式。

文件结构

  • 头信息:包含词典的元数据,如词典名称、版本号、作者、版权信息等。
  • 索引:用于快速查找词条的位置。索引通常是一个二进制树结构,支持高效的搜索。
  • 正文:包含词条的具体内容,每个词条通常包括词头(关键词)和词尾(解释)。

特点

  • 高效搜索:MDX 文件通过索引实现了高效的词条查找,支持模糊搜索和前缀匹配。
  • 多语言支持:支持多种语言和编码方式,可以存储不同语言的词典。
  • 富文本格式:支持 HTML 标签,可以包含超链接、图片、表格等富文本内容。
  • 压缩存储:MDX 文件通常经过压缩,以节省存储空间。

示例

假设有一个名为 example.mdx 的文件,其内容可能如下:

[MDX Header]
Title: Example Dictionary
Version: 1.0
Author: John Doe
Encoding: UTF-8

[MDX Index]
apple -> 0x100
banana -> 0x200
cherry -> 0x300

[MDX Body]
0x100: <h1>Apple</h1><p>A fruit that is often red or green.</p>
0x200: <h1>Banana</h1><p>A yellow fruit that is curved in shape.</p>
0x300: <h1>Cherry</h1><p>A small, round fruit that is usually red or black.</p>

MDX文件结构分析

MDD 格式

基本概念

  • MDD(Multilingual Dictionary Data)是一种用于存储多媒体数据的文件格式。
  • MDD 文件通常与 MDX 文件配套使用,用于存储词典中的图片、音频、视频等多媒体内容。

文件结构

  • 头信息:包含多媒体数据的元数据,如文件类型、版本号、作者等。
  • 索引:用于快速查找多媒体文件的位置。索引通常是一个二进制树结构,支持高效的搜索。
  • 数据:包含多媒体文件的内容,每个文件通常有唯一的标识符。

特点

  • 高效存储:MDD 文件通过索引和压缩技术,实现了高效的多媒体数据存储。
  • 多种媒体类型:支持图片(如 JPEG、PNG)、音频(如 MP3、WAV)、视频(如 MP4)等多种媒体类型。
  • 关联性强:MDD 文件中的多媒体内容可以通过 MDX 文件中的超链接引用,实现词典内容和多媒体数据的无缝结合。

示例

假设有一个名为 example.mdd 的文件,其内容可能如下:

[MDD Header]
Title: Example Dictionary Media
Version: 1.0
Author: John Doe

[MDD Index]
apple.jpg -> 0x100
banana.mp3 -> 0x200
cherry.png -> 0x300

[MDD Data]
0x100: [Binary data of apple.jpg]
0x200: [Binary data of banana.mp3]
0x300: [Binary data of cherry.png]

MDD文件结构分析

MDict v3 Format

MdxBuilder 4.x 创建的是v3格式。主要的变化有:

  • 文件被分为4个块,即键索引、键数据、记录索引和记录数据。所有块都具有相同的结构。解码后的块包含类型依赖数据。
  • 部分块数据(目前为前16字节)总是通过_fast_encrypt或_salsa_encrypt进行加密(可能在压缩之后)。加密密钥全局地从字典头的UUID值派生(自MdxBuilder 4.0 RC4起),
key = xxh64_digest(uuid[:18]) + xxh64_digest(uuid[18:])

或者从每个块数据的Adler-32校验和中单独派生(直到MdxBuilder 4.0 RC2),

key = ripemd128(alder)

MDict 3.0 File Structure Analysis

Python读写MDict词典文件

mdict-util

mdict-utils是一个Python工具包,专为处理MDict字典文件格式而设计。

基本概述

  • mdict-utils提供了一组命令行工具,用于打包、解包、列出信息和查询MDict字典文件。
  • 该工具包并不提供图形用户界面,而是通过命令行接口进行操作,这使得它特别适合脚本编写和自动化任务。
  • mdict-utils是基于Python开发的,因此可以跨平台使用,并且易于集成到现有的Python项目中。

核心功能

  • 打包(pack):将分散的字典数据和资源打包成一个MDict字典文件(.mdx或.mdd)。这有助于数据的分发和共享。
  • 解包(unpack):将MDict字典文件解包成其原始的字典数据和资源。这对于字典的编辑、修改和分析非常有用。
  • 列出信息(list):显示MDict字典文件中的条目列表或特定信息。这可以帮助用户了解字典文件的结构和内容。
  • 查询(info):提供查询功能,允许用户根据关键词检索MDict字典文件中的信息。

使用与安装

  • mdict-utils可以通过Python的包管理工具pip进行安装,使用命令pip install mdict-utils即可。
  • 安装完成后,用户可以在命令行中使用mdict-utils提供的命令来执行不同的操作。
  • mdict-utils的使用主要基于命令行参数,用户可以通过不同的参数组合来实现所需的功能。

应用场景

  • 字典制作与编辑:mdict-utils为字典制作者和编辑者提供了一个强大的工具集,用于创建、修改和维护MDict格式的字典文件。
  • 数据分析与挖掘:通过解包MDict字典文件,研究人员可以访问字典的原始数据,进而进行数据分析、挖掘和可视化等工作。
  • 自定义字典应用:开发者可以利用mdict-utils来构建自定义的字典应用,如电子词典、在线查询系统等。

社区与贡献

  • mdict-utils是一个开源项目,其源代码托管在公开的代码仓库中。这意味着任何人都可以查看、使用、修改和贡献代码。
  • 开源社区的支持使得mdict-utils能够不断发展和完善,满足更多用户的需求。

以下为详细的使用说明:

数据查询

# 查看元信息:
mdict -m dict.mdx
# 列出所有键:
mdict -k dict.mdx
# 查询键:
mdict -q <word> dict.mdx

注意:仅用于测试词典打包是否正确。

解包

# 解包 MDX:
mdict -x dict.mdx -d ./mdx
# 解包 MDX/MDD 并分成 5 个文件:
mdict -x dict.mdx -d ./mdx --split-n 5
# 解包 MDX/MDD 并分成 a...z 文件:
mdict -x dict.mdx -d ./mdx --split-az
# 解包 MDD:
mdict -x dict.mdd -d ./mdd
# 解包 MDX/MDD 到 sqlite3 数据库:
mdict -x dict.mdx --exdb
mdict -x dict.mdd --exdb
# 解包 MDX/MDD 到使用 zip 压缩的 sqlite3 数据库:
mdict -x dict.mdx --exdb-zip

打包

# 打包 MDX:
mdict --title title.html --description description.html -a dict.txt dict.mdx
# 使用多个 TXT 文件打包 MDX:
mdict --title title.html --description description.html -a dict.part1.txt -a dict.part2.txt dict.mdx
# 或者:
mdict --title title.html --description description.html -a txt_dir dict.mdx
# 打包 MDD:
mdict --title title.html --description description.html -a mdd_dir dict.mdd
# 其他 将 TXT 转换为 sqlite3 数据库:
mdict --txt-db dict.txt
# 将 sqlite3 数据库转换为 TXT:
mdict --db-txt dict.db

readmdict

readmdict 是一个用于读取和解析 MDict 词典文件的 Python 库。MDict 是一种常见的电子词典格式,广泛用于各种平台上。readmdict 提供了一种方便的方法来访问和操作这些词典文件中的数据,特别是 .mdx 和 .mdd 文件。

主要功能

  • 解析 .mdx 文件:readmdict能够解析 MDict 的 .mdx 文件,提取词条和其对应的定义。这样,用户可以以编程方式访问词典中的内容。
  • 解析 .mdd 文件:除了文本数据,MDict 词典还可能包含多媒体数据(如图片、音频),这些数据通常存储在 .mdd 文件中。readmdict也支持解析 .mdd 文件,以便用户提取多媒体资源。
  • 支持多种编码:MDict 文件可能使用不同的字符编码。readmdict可以自动检测和处理多种编码格式,确保正确读取文件内容。
  • 高效的数据访问:通过索引和缓存机制,readmdict提供了高效的词典数据访问方式,使得查询速度更快。

使用示例

from readmdict import MDX

# 加载 .mdx 文件
mdx_file = MDX('path/to/dictionary.mdx')

# 获取词典的元数据
meta_info = mdx_file.get_header()
print(meta_info)

# 获取所有词条
keys = list(mdx_file.keys())
print(keys)

# 查询特定词条
word = 'example'
definition = mdx_file[word]
print(definition)

应用场景

  • 词典应用开发:readmdict非常适合用于开发需要集成电子词典功能的应用程序。
  • 数据转换和分析:通过解析 MDict 文件,用户可以将词典数据转换为其他格式(如 JSON、CSV),以便在数据分析或其他应用中使用。
  • 教育和研究:研究人员和教育工作者可以利用readmdict 来访问和分析语言资源。

依赖和安装

readmdict 是一个开源项目,通常可以通过 Python 包管理器 pip 安装:pip install readmdict

注意事项

  • 在使用readmdict 时,请确保您有权访问和使用相关的 MDict 词典文件。
  • 由于词典文件可能很大,处理时需要注意内存使用情况。

总之,readmdict 是一个功能强大且易于使用的工具,适合需要处理 MDict 词典文件的开发者和研究人员。

mdict-query

mdict-query 是一个 Python 库,专门用于查询 MDict 字典文件(.mdx 和 .mdd 文件)。它提供了一个简单易用的接口,使得开发者可以轻松地在自己的应用程序中集成字典查询功能。

主要功能

  • 查询字典:
    • 支持查询.mdx 文件中的词条。
    • 支持查询.mdd 文件中的资源(如图片、音频等)。
  • 高效性能:
    • 使用内存映射文件技术(memory-mapped files)来提高查询速度。
    • 内部优化了数据结构和算法,以确保高效的查询性能。
  • 易用性:
    • 提供了简洁的 API,使得集成到其他 Python 项目中非常容易。
    • 支持多种查询方式,包括精确匹配、模糊匹配等。
  • 多平台支持:
    • 由于是纯 Python 实现,可以在 Windows、Linux 和 macOS 等多个平台上运行。

安装

你可以使用 pip 来安装 mdict-query:pip install mdict_query

详细 API

IndexBuilder 类

初始化:

builder = IndexBuilder(mdx_file_path, encoding='utf-8')
  • mdx_file_path: 字典文件的路径。
  • encoding: 字典文件的编码,默认为utf-8。

查询词条:

result = builder.mdx_lookup(keyword, ignorecase=True, split=True, strip=True, rawstr=False)
  • keyword: 要查询的词条。
  • ignorecase: 是否忽略大小写,默认为True。
  • split: 是否将结果按段落分割,默认为True。
  • strip: 是否去除结果中的空白字符,默认为True。
  • rawstr: 是否返回原始字符串,默认为False。

查询资源:

resource = builder.mdd_lookup(key)
  • key: 资源的键(通常是文件路径)。

获取字典信息:

info = builder.get_mdx_info()
print(info)

示例代码

以下是一个完整的示例,展示了如何使用 mdict-query 查询字典和资源文件:

from mdict_query import IndexBuilder

# 加载 .mdx 文件
mdx_builder = IndexBuilder('path/to/your/dictionary.mdx')

# 查询词条
result = mdx_builder.mdx_lookup('reverse engineering')
print(result)

# 加载 .mdd 文件
mdd_builder = IndexBuilder('path/to/your/resources.mdd')

# 查询资源
resource = mdd_builder.mdd_lookup('\image.png')
print(resource)

writemdict

writemdict 是一个用于创建和写入 MDict 词典文件的 Python 库。MDict 是一种流行的电子词典格式,支持用户自定义词典文件。writemdict 提供了一种方便的方法来生成 .mdx 和 .mdd 文件,允许开发者和用户创建自己的词典。

主要功能

  • 创建 .mdx 文件:
    • 支持生成包含字典条目的 .mdx 文件。
    • 可以设置字典的标题、描述和其他元数据信息。
  • 创建 .mdd 文件:
    • 支持生成包含资源文件(如图片、音频等)的 .mdd 文件。
    • 可以将资源文件与字典条目关联起来。
  • 高效性能:
    • 使用内存映射文件技术(memory-mapped files)来提高生成速度。
    • 优化了数据结构和算法,以确保高效的文件生成。
  • 易用性:
    • 提供了简洁的 API,使得集成到其他 Python 项目中非常容易。
    • 支持多种数据输入方式,包括从文件(如 JSON、CSV、纯文本)、内存数据等。

安装

你可以使用 pip 来安装 writemdict:pip install writemdict

使用示例

创建 .mdx 文件

from writemdict import MDict

# 创建 MDict 对象
mdx = MDict()

# 添加字典条目
mdx.add('apple', 'A fruit that is typically red, green, or yellow.')
mdx.add('banana', 'A long curved fruit with a yellow skin.')

# 设置字典元数据
mdx.set_title('My Dictionary')
mdx.set_description('A simple example dictionary.')

# 生成 .mdx 文件
mdx.write('my_dictionary.mdx')

创建 .mdd 文件

from writemdict import MDict

# 创建 MDict 对象
mdd = MDict()

# 添加资源文件
mdd.add('image1.png', b'\x89\x50\x4e\x47\x0d\x0a\x1a\x0a...')  # 替换为实际的二进制数据
mdd.add('audio1.mp3', b'\xff\xf3\x1c\xec...')  # 替换为实际的二进制数据

# 生成 .mdd 文件
mdd.write('my_resources.mdd')

创建关联

from writemdict import MDictWriter

# 创建 MDictWriter 实例
writer = MDictWriter(title="Example Dictionary", description="This is an example dictionary.")

# 添加包含图片引用的字典条目
writer.add('apple', 'A fruit that is typically red or green. <img src="example.png" />')

# 写入.mdx文件
with open("dictionary.mdx", "wb") as outfile:
    writer.write(outfile, mdd_files=['example.png'])  # 这里将example.png也作为资源文件写入

详细 API

MDict 类

初始化:

mdx = MDict()
  • 无参数,创建一个空的 MDict 对象。

添加字典条目:

mdx.add(keyword, content)
  • keyword: 字典条目的关键字。
  • content: 字典条目的内容,可以是字符串或二进制数据。

设置字典元数据:

mdx.set_title(title)
mdx.set_description(description)
mdx.set_css(css)
mdx.set_encoding(encoding)
  • title: 字典的标题。
  • description: 字典的描述。
  • css: 字典的 CSS 样式表。
  • encoding: 字典文件的编码,默认为utf-8。

生成 .mdx 或 .mdd 文件:

mdx.write(filename)
  • filename: 输出文件的路径和文件名。

参考链接:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注