最近在工作中遇到一个特殊情况,需要大量的读取Word文档(doc文档)中的信息,为了减少工作量,我决定使用Python解决。但是刚刚动手,就出现了一个问题,根据查询,能够读取doc文档的Python库我只找到了win32com,而这个库只能在Windows上执行,我使用的是Linux系统(国产deepin),无法使用。Python-docx库可以在Linux系统上运行,但是只能读取docx文档。所以我决定曲线救国。
既然doc不能读取,那就把doc转换成docx再读取就好了。然而,并没有那么顺利……Python批量转换doc还是需要win32com库……所以还得再曲线一下,我决定看看使用Linux终端能不能解决这个问题。
经过大量查询,我终于确认,使用一个叫libreoffice的软件通过终端可以把doc转换成docx,再通过Python模拟终端操作,不就能批量转换了么,说干就干。
1、安装libreoffice
使用以下命令进行安装
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
sudo apt install libreoffice
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
注:我使用的deepin系统已默认安装,不需要重复安装。
使用终端转换需要安装Java,deepin默认未安装,可以在终端执行以下命令安装
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
sudo apt install
openjdk-8-
jdk
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
最后,还需要一个插件将libreoffice和java结合起来
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
sudo apt install libreoffice- java-common
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
这样,准备工作就完成了。
2、测试运行
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
soffice --headless --invisible --convert-to docx /test/test.doc
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
把/test/test.doc替换成你需要测试的文件地址就行了,输出的文件会在相同的文件夹下出现,如果要指定输出位置,在后面加上“--outdir(空格)文件夹地址”就好了。如果到这一步是正常的,那就可以开始接下来的工作了。
注:如果无法正常使用,可以尝试执行以下命令重新安装libreoffice试一试。
sudo apt remove openoffice* libreoffice*
sudo apt install libreoffice*
3、使用Python批量转换
这里涉及到两个库,一个是
subprocess
,一个是os。
代码如下:
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
import subprocess
import os
def save_doc_to_docx(dir_path, dir_name):
# 注意:这里要用subprocess的run方法,这是Python3.4之后的用法,如果还用之前的方法会报错。
output
= subprocess.run(
[
"soffice"
,
"--headless"
,
"--invisible"
,
"--convert-to"
,
"docx"
,
f
"{dir_path}+{dir_name}"
,
"--outdir"
,
f
"{dir_path}+'docx/'"
])
return
output
path
=
input
(
"
请输入文件夹地址:
"
)
if
path
[
-1
] !=
"/"
:
path
=
path
+
"/"
# 有时候输入地址会漏掉最后一个/,给自己做个补救
for
i
in
os
.listdir(
path
):
if
i.endswith(
'.doc'
)
and
not
i.startswith(
'.~'
):
# 找出doc文件并排除临时文件干扰(Linux的临时文件前是‘.~’,win的是‘~$’)
# 但如果没有开显示隐藏文件的话,转换出来的文件也应该是隐藏的吧,猜测,没试过
save_doc_to_docx(
path
, i)
![](http://i0.hdslb.com/bfs/article/4adb9255ada5b97061e610b682b8636764fe50ed.png)
4、总结
解决这次遇到的问题,是一个学习的过程,通过网络查询了很多知识,丰富了我的知识储备,也提升了我的 偷懒能力 工作效率 。最后,B站什么时候能提升以下专栏编辑的功能,支持下Makedown啥的,写的好累。