掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 64561|回复: 415

[工具] ⚜【支持超大文件】Python MDX词典打包工具 2019-11-19更新

  [复制链接]
  • TA的每日心情
    奋斗
    2025-9-10 20:08
  • 签到天数: 250 天

    [LV.8]以坛为家I

    发表于 2019-10-9 03:46:36 | 显示全部楼层 |阅读模式
    本帖最后由 lgmcw 于 2025-9-21 23:58 编辑 4 W1 U; K( F# I5 l( c, S
    $ j3 d; E3 u/ ?; ?  F6 U6 Q
    这帖target的是硬核玩家,希望对有需要的人有所帮助。代码比较乱,拖了好久都懒得整理,正好朋友又找我需要,趁着一鼓作气整理出来就正好也贴在论坛里吧。我这里不跟进你那边的环境调试了,如果有运行错误自己修一下(python3可参考楼下的修改经验);不过还是鼓励回帖反馈。对我以后做新人友好版有帮助。& W. E; E" W& n( `5 y& y
    以后我会做一款带GUI的,针对小白玩家。
    3 R& x& p# j  L( a5 b6 n. z  @( e
    # p5 h  p0 \" y5 L  t& x# d, w3 r入口文件,运行genMDX_ox4.py即可开始打包,附了一个牛津4的txt源码,我已经调试好,确保在我这里能工作,下载后可以直接运行用来测试程序。我的所有字典都是用这个程序打包,暂时没什么大问题。词条数最多我试过的简明英汉400多万词头;体积最大的OED,txt源码就有2.4G;这些打包都毫无压力。不过我这边还在用老古董python2.7;python3应该也能用,如果报错,可能需要自己debug一下。
    ' b: K, E( G0 `0 C& i, o7 N- pgenMDX_ox4.py is the entrance file you want to use in CMD/terminal. I've also enlcosed a OALD4_azure.txt for testing purpose.
    ' y" |! j  b5 b$ T! |0 F# g9 r  P* q- O, B
    4 H% O8 w# y% F/ N$ u* n* k
    ) Q& R3 G8 Q' ^7 R- e* t( ~
    Windows下运行举例(需安装python):/ `& ^1 V! T& E5 P/ ?

    ( V) X9 Q' h8 ~" f% A$ J# z- \8 F, w# }& W2 [- q# N' Z* Q
    相较于原版我主要改了两个地方:
    ( T; p  r% H5 L; c3 p" l- h: F1. 在代码里,以前一个字典的key只能对应唯一个value。而MDict完全支持多个相同词头对应多个意思。所以我改了代码,让一个字典的key可以对应多个value。
    % d0 E) e, O5 T2. 修改排序算法,原版是用的默认python排序,输出的文件在MDict简直不能查。GD勉强能查。
    ( y  y8 W' g7 O$ L2 W6 [
    # j7 G1 h. ?$ {+ r# |7 \9 B0 o6 Q6 F' E# l3 t
    1 Y4 i+ e' |& t- g6 A4 Q
    Python实现的txt转MDX代码:
    & V6 B4 L% C8 c8 Z/ `7 y& a1 K; f$ O3 W6 b; m8 O; C
    链接:https://pan.baidu.com/s/1wdRZXRvQBfyS3AVDGmiD0g  提取码:avqf 欢迎提建议
    + _$ A/ _, p- y. b, T. \⚜ 感兴趣可以看看我的其他字典,绝大部分都公开分享。
    9 s. O( ]: q% S" z2 M; O
    8 s) g, @  K) w) M
    7 y3 B$ y- W+ l4 \8 O8 x: O, E3 a2 E% O% ]3 E1 k# X+ I, i7 S

    * B* W7 b1 i7 c) F
    % ]& P. F8 F8 L+ [. x$ @- a" J6 R0 C, ]

    评分

    5

    查看全部评分

    本帖被以下淘专辑推荐:

    该用户从未签到

    发表于 2021-7-23 14:38:37 | 显示全部楼层
    python3.8.9调试成功!
    3 P1 }" C, }0 Y4 B, a2 d) X! x; Q' e7 z: O9 W$ R1 p; p5 K
    做了如下修改:) N8 a1 ]* v3 \1 Y2 U
    4 O( T. o+ ]3 f3 r# L0 Y3 @% P8 U
    1.genMDX_ox4.py$ W4 v- y" S$ M; ^( Z$ a" ?
    - c/ j5 ~3 ^( U
    (1)注释掉前三行# -*- coding: GBK -*-  # coding: utf-8  # encoding=utf8,解决SyntaxError: encoding problem: GBK
    ! r  I' `  J, p7 i/ Z; g) d
    1 I" q' o# P0 C3 M0 f6 s7 t(2)注释掉import sys  reload(sys)  sys.setdefaultencoding('utf-8'),python3不需要了
    5 o: d1 f$ E/ J$ Z# f8 F$ s6 q/ |# L5 q! j3 ?) H/ D" A- k& J% x
    (3)打开、写入的文件加上当前路径(import os;current_path = os.path.dirname(__file__);current_path+"/OALD4_azure.txt",),解决No such file or directory:
    ! _* h. }2 X8 H: }! l1 S* y
      d2 d4 R0 V7 e3 l: ~6 j(4)大神提示OALD4_azure.txt、about_OX4.txt使用utf-8格式。我试了下,两个文件转换为gb2312,代码修改为encoding='ANSI',也可以成功。另外,goldendict可以打开这两种编码的mdx,mdictpc版只能打开ANSI编码的mdx文件。8 m, _! `# N  g6 J" \& J) p- ]
    $ u" k* l* g, @- W
    2.writemdict.py
    ; Z: Z+ K, r+ @" H( N$ I$ s! ]' H2 J
    修改 from cgi import escape为 from html import escape,解决cannot import name 'escape' from 'cgi' ,因为python3 cgi.py里面已经没有escape了。换成html,可以用,暂未发现问题。

    评分

    1

    查看全部评分

  • TA的每日心情
    无聊
    2023-12-27 22:43
  • 签到天数: 500 天

    [LV.9]以坛为家II

    发表于 2019-12-6 14:19:04 | 显示全部楼层
    我的是Python3.7的,genMDX_ox4.py文件里面的$ \5 G( W' ]* `7 @- B8 q2 p
    imp.reload(sys)改为:% V$ Y8 M& Q2 x; r. p8 W5 i
    import importlib$ S7 N& l9 F# C5 ]
    importlib.reload(sys)) G! Q3 S. m/ ?2 D8 O  j
    然后删掉:sys.setdefaultencoding("utf-8")
    2 G* s% H# Q- A# B, f* b; h测试通过。# {1 s! T# z1 i1 M' z3 n

    2 S/ f: {6 W) @) y4 P! K但是生成的词典,用SourceEditor打不开,PC版GoldenDict,安卓版欧路可以打开。汇报完毕。

    评分

    1

    查看全部评分

    该用户从未签到

    发表于 2023-3-9 22:28:50 | 显示全部楼层
    好的,感谢老铁啊

    该用户从未签到

    发表于 2023-3-8 14:04:03 | 显示全部楼层
    感谢大神分享
  • TA的每日心情
    慵懒
    2023-10-11 10:27
  • 签到天数: 198 天

    [LV.7]常住居民III

    发表于 2023-2-14 11:51:09 | 显示全部楼层
    感谢楼主分享

    该用户从未签到

    发表于 2022-12-30 17:34:07 | 显示全部楼层
    谢谢高手无私分享这么好的教程
  • TA的每日心情
    开心
    2021-11-18 11:26
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2022-12-28 10:39:48 | 显示全部楼层
    试试看,谢谢大佬
  • TA的每日心情
    衰
    2022-5-16 09:51
  • 签到天数: 208 天

    [LV.7]常住居民III

    发表于 2019-12-9 09:53:05 | 显示全部楼层
    反馈个问题,直接跑大佬的源码,在mac上会报如下错误:
    ' M6 j" a0 `$ Q% T$ ]) v, V0 L7 WTraceback (most recent call last):4 P# L1 w1 L! j8 ^; @$ p) h
      File "genMDX_ox4.py", line 14, in <module>% X( q8 j+ U- W# y) `  s& N' e
        reload(sys); q( k: Z0 O2 A( H! R: Z) C
    NameError: name 'reload' is not defined
    4 T6 f# i3 ?3 ]9 T; R# j0 ~; C; b; c8 ?# R/ o4 }6 G
    解决:
    4 v5 J( m- }# y& W: Y3 {* v" U注释掉文件line14和line15,即可

    点评

    应该是python3和python2.7的区别  发表于 2019-12-9 10:15

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    2023-1-18 13:13
  • 签到天数: 539 天

    [LV.9]以坛为家II

    发表于 2019-10-9 08:44:33 | 显示全部楼层
    谢谢L大,等了1年了。
  • TA的每日心情
    无聊
    2023-6-6 10:30
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2023-3-29 17:40:05 | 显示全部楼层
    谢谢大佬 都是好东西来晚了 就看到要关站
  • TA的每日心情
    开心
    2023-2-21 17:06
  • 签到天数: 227 天

    [LV.7]常住居民III

    发表于 2019-10-9 06:37:56 | 显示全部楼层
    先收藏再研究,谢谢分享
  • TA的每日心情
    无聊
    2021-8-13 07:38
  • 签到天数: 195 天

    [LV.7]常住居民III

    发表于 2019-10-9 07:00:20 | 显示全部楼层
    thanks a lot
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-10-9 07:09:48 | 显示全部楼层
    感謝 lgmcw 兄:' f9 m7 |: r( T
    分享
    【支持超大文件】Python打包MDX词典工具
    ( x# S$ {* O" ?7 f' n  z& k
    非常需要此超大文件打包, 有的文件再合併後再用 mdxbuilder 打包MDX弄不出來: k! _* {' z; W/ p* _
    謝謝仁兄分享此重量級工具" l0 B; `2 t/ q; t. {
  • TA的每日心情
    擦汗
    2022-5-20 11:41
  • 签到天数: 222 天

    [LV.7]常住居民III

    发表于 2019-10-9 07:54:53 | 显示全部楼层
    謝謝分享資源
  • TA的每日心情
    无聊
    3 小时前
  • 签到天数: 3165 天

    [LV.Master]伴坛终老

    发表于 2019-10-9 08:05:03 | 显示全部楼层
    好东西,学习学习,谢谢楼主分享技术
  • TA的每日心情
    开心
    2020-1-5 08:04
  • 签到天数: 50 天

    [LV.5]常住居民I

    发表于 2019-10-9 08:19:19 | 显示全部楼层
    謝謝分享此重量級工具,感谢 !

    点评

    如果是古籍文献,有可能需要用UTF-16。要自己摸索一下修改入口文件。  发表于 2019-10-10 01:04
  • TA的每日心情
    开心
    2022-1-21 00:52
  • 签到天数: 699 天

    [LV.9]以坛为家II

    发表于 2019-10-9 08:28:06 | 显示全部楼层
    学习,谢谢楼主分享技术,争取以后逐步从小白玩家进化到硬核玩家。
  • TA的每日心情
    无聊
    2020-12-19 21:10
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    发表于 2019-10-9 09:06:01 | 显示全部楼层
    谢谢l大,准备考研结束后就折腾折腾
  • TA的每日心情
    奋斗
    2021-3-15 08:06
  • 签到天数: 585 天

    [LV.9]以坛为家II

    发表于 2019-10-9 09:07:57 | 显示全部楼层
    非常感谢你的分享。
  • TA的每日心情
    奋斗
    2023-2-19 20:22
  • 签到天数: 682 天

    [LV.9]以坛为家II

    发表于 2019-10-9 09:21:53 | 显示全部楼层
    好东西 谢谢分享
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2019-10-9 09:30:46 | 显示全部楼层
    請問 mdxbuilder 目前能處理的文檔大概是多大?
  • TA的每日心情
    怒
    2019-9-20 08:37
  • 签到天数: 214 天

    [LV.7]常住居民III

    发表于 2019-10-9 10:06:07 | 显示全部楼层
    还是可以指定输入文件的命令行方式不较好
    - V, j9 g7 W% o/ [6 e: |比如 python genMDX.py source.txt about.txt
  • TA的每日心情
    擦汗
    2025-3-22 20:43
  • 签到天数: 314 天

    [LV.8]以坛为家I

    发表于 2019-10-9 10:14:53 | 显示全部楼层
    emmm论坛有个excel转mdx的工具很不好用。。。
  • TA的每日心情
    开心
    2023-9-27 20:45
  • 签到天数: 847 天

    [LV.10]以坛为家III

    发表于 2019-10-9 16:54:33 | 显示全部楼层
    感谢分享,看看,学习一下
  • TA的每日心情
    奋斗
    2025-9-10 20:08
  • 签到天数: 250 天

    [LV.8]以坛为家I

     楼主| 发表于 2019-10-10 01:02:33 | 显示全部楼层
    HMPT 发表于 2019-10-9 10:06! a6 _( o  M4 z* v8 s  J, ]
    还是可以指定输入文件的命令行方式不较好6 Q9 c" U& V' q- i
    比如 python genMDX.py source.txt about.txt ...

    * l4 P) E7 I! H这个其实改一下入口文件就能实现,应该不难的。
  • TA的每日心情
    奋斗
    2025-9-10 20:08
  • 签到天数: 250 天

    [LV.8]以坛为家I

     楼主| 发表于 2019-10-10 01:03:25 | 显示全部楼层
    本帖最后由 lgmcw 于 2019-10-10 01:58 编辑
    3 g8 b; a2 V# i& K+ D
    oversky 发表于 2019-10-9 09:30$ [* P6 r% s; g+ H: g
    請問 mdxbuilder 目前能處理的文檔大概是多大?

    + \2 `$ u6 x* e7 F4 I你可以咨询一下@喬治兄 ,他可是屡屡遇到上限。
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2019-10-10 07:27:37 | 显示全部楼层
    lgmcw 发表于 2019-10-10 01:03* _! O, A6 y3 m, V' o
    你可以咨询一下@喬治兄 ,他可是屡屡遇到上限。
    % A# N) N, @, h
    谢谢您的指引。

    该用户从未签到

    发表于 2019-10-10 11:24:07 | 显示全部楼层
    很有用的工具
  • TA的每日心情
    开心
    2021-4-24 17:14
  • 签到天数: 119 天

    [LV.6]常住居民II

    发表于 2019-10-10 11:45:08 | 显示全部楼层
    非常感谢分享!
  • TA的每日心情
    奋斗
    2025-9-10 20:08
  • 签到天数: 250 天

    [LV.8]以坛为家I

     楼主| 发表于 2019-10-12 12:38:31 | 显示全部楼层
    喬治兄 发表于 2019-10-9 07:09
    2 V, H2 r3 l0 y, c! _; V5 C% s4 p感謝 lgmcw 兄:
    8 L8 P; k) Z. y7 V4 ^分享  
    $ l8 U( |. ]8 T/ _* X8 c6 K非常需要此超大文件打包, 有的文件再合併後再用 mdxbuilder 打包MDX弄不出來

    1 |; U8 x$ H, Q4 _- ?7 e# Q: H兄弟可测试通过,此工具可还好用?
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-10-12 12:48:11 | 显示全部楼层
    lgmcw 发表于 2019-10-12 12:38  z1 E1 s1 k2 _, _  F3 z. B6 ~
    兄弟可测试通过,此工具可还好用?
    , S9 u& O3 z9 E& e( ^3 e
    謝謝 lgmcw 兄關心,小弟還未試呀,小弟會盡快試試,若有困難再向仁兄請益,謝謝啦!
  • TA的每日心情
    开心
    2019-3-26 21:36
  • 签到天数: 178 天

    [LV.7]常住居民III

    发表于 2019-10-12 15:33:11 | 显示全部楼层
    本帖最后由 流星冲击 于 2019-10-12 15:37 编辑 " {' W7 V/ ?8 ]6 K: w0 B

    7 L# ~; E2 S1 o" N* |3 H4 ^2 _1. 在代码里,以前一个字典的key只能对应唯一个value。而MDict完全支持多个相同词头对应多个意思。所以我改了代码,让一个字典的key可以对应多个value。
    - E+ T: S4 f3 A$ @
      K+ D8 C. ^9 P5 @之前我和zzzz_sleep讨论过“以前一个字典的key只能对应唯一个value”的问题,他给出的方法是让类Mdict套壳的软件/app的作者去解决,例如用@@@link和a href=词头#锚跳相混合实现查询多个value的方式(具体zzzz_sleep给出的代码的用法我也忘记了,不过印象中还是基于一个key对应一个value的用法),现在楼主这个工具直接从代码层修改一个key对应多个value,这个要给个赞!
      |6 C7 B1 Q( L# m0 Q
    * L* h* e, [) M  p2. 修改排序算法,原版是用的默认python排序,输出的文件在MDict简直不能查。GD勉强能查。+ J; ]8 J, g/ {# G+ G0 L9 `

    6 v3 L1 k# N) Y4 H" I  ]4 y& I我没用Mdict_PC来查询生成的mdx,对于GoldenDict,我看了某些帖子的说法,GD是全部提取mdx的headwords为一个缓存文件而不依赖原生的mdx算法的排序的,相同词头(例如a和A)是以类似多本词典联合查询单词的方式在一个页面内列出所有a和A词头的内容的,如果GD不依赖原生的mdx算法排序,楼主说“GD勉强能查”是单词基本能查询,不过不按照Azure排序(dot,doT,dOt...)这样排列下来?8 ^, |8 G4 y  k( i$ ^3 [
    手机端的app,以Azure排序,单本词典查询的模式下,安卓mdcit和平典app(平典app可能有些带符号的单词查不到什么的,平典以前的国庆版本就查不到楼主你用python生成的新牛津v2.3.0 beta的单词词头)查询是完美支持这种排序的,而不是原生A再到a这样下来。深蓝dict不能单本词典模式查词,所以不能看到多个a和A,a和A的内容会挤在一个界面,由于不能单本查词,ff大的朗文5++ v1.3.5的气球在滑动单词页面时不能固定在右下角(直接在单词页面最右下角,对于长内容,需要滑动到页面最底部)。欧路app未测试。
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2026-10-15 11:16 , Processed in 0.027517 second(s), 29 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表