0%

lrmx格式文件解析

前言

偶然的机会,接触到了lrmx格式的文件,就用Python写了一点代码对文件进行了解析,在这里简单梳理一下。

lrmx文件格式

在网上搜了一下lrmx文件格式,发现相关的信息寥寥无几,真正有用的有以下这么几条:

大概总结一下:

  1. lrmx似乎是跟叫“干部任免审批表编辑器”的软件有关;
  2. lrmx编辑器可以用Python打开。

lrmx文件编辑器

顺着线索1,我们继续搜索,发现了“干部任免审批表编辑器”这个软件,并且从共产党员网(http://www.12371.cn/zgrjxz/rmbbjq/)上下载了下来,安装好以后是这个样子(图标是大写的ZZB),看上去就是一个填写Word、Excel或者PDF表格的东西,填写好的文档保存以后就是lrmx文件。

到这里就基本明了了——lrmx是这个编辑器专用的格式。怪不得找不到什么信息!

lrmx文件结构

如果是专用的格式,我们是不是就无法用Python进行处理了?还是要先转成Word再去想办法?

莫慌,线索2给了提示:可以用Python读写lrmx格式的文件。

lrmx看上去像是个文本文件,我们先填好一个,然后用Notepad++打开看一下:

这一下就明白了:lrmx用的其实是xml(可扩展标记语言,Extensible Markup Language),那显然就可以用Python解析XML的方法来解析。

Python提取lrmx文件信息

根据维基百科介绍,XML指可扩展标记语言,被广泛用来作为跨平台之间交互数据的形式,主要针对数据的内容,通过不同的格式化描述手段(XSLT,CSS等)可以完成最终的形式表达(生成对应的HTML,PDF或者其他的文件格式)。

常见的 XML 编程接口有 DOM 和 SAX,Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree。在这里我们使用DOM接口解析lrmx。

用xml.dom解析lrmx

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后我们可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

lrmx文件其实很小,而我们要解析的信息既有前面的,也有后面的,所以用DOM就比较方便。

  • 调用xml.dom.minidom.parse()方法打开lrmx文件,记为dom;
  • 然后用dom.documentElement得到文档元素对象,记为root;
  • 假设我们提取姓名这一元素,则可以使用root.getElementsByTagName()去解析相应的标签;
  • 最后把解析除的内容导出即可。

具体实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#打开xml文档

dom = xml.dom.minidom.parse(file)

#得到文档元素对象

root = dom.documentElement

name = root.getElementsByTagName("XingMing")[0].firstChild.data

position = root.getElementsByTagName("XianRenZhiWu")[0].firstChild.data

personal_id = root.getElementsByTagName("ShenFenZheng")[0].firstChild.data

index = index + 1

row_info = {"序号": index,
"姓名": name,
"身份证号": personal_id,
"职务": position,
}

文件批量读取

其实这一块,没有太多可以说的。主要就是以下几条吧(参考stack overflow上的回答,):

Python 3.5+

  • 法1:用glob.glob()函数,用** 匹配,传入recursive=True的参数。
  • 法2:用pathlib.Path.rglob()函数。
1
2
3
4
from pathlib import Path

for filename in Path('rmb').rglob('*.lrmx'):
print(filename)

旧版本Python

  • os.walk()递归遍历目录;
  • fnmatch.filter匹配文件格式等。
1
2
3
4
5
6
7
import fnmatch
import os

matches = []
for root, dirnames, filenames in os.walk('rmb'):
for filename in fnmatch.filter(filenames, '*.lrmx'):
matches.append(os.path.join(root, filename))

此外,对于以.开头的文件或目录,也建议采用os.walk()的方法。

小结

在这里,借用朋友的一段话作为总结:

磨刀不误砍柴工,如果你接到一项特别复杂的任务,第一,搞清楚目标产出;第二,盘点资源;第三,在利用资源的方式上下功夫,通过变通资源组织方式提高效率!

一个人一件小事、一个组织一件大事、甚至一个国家一项事业,莫不如此。

张da统帅 wechat
扫码订阅我的微信公众号
走过路过,切莫错过!