python在windows与linux下读取doc文件
前言
记录一下自己走的弯路,能帮助大家少走一点弯路。读取doc文件流程,基本上都是将doc文件转为docx文件或者pdf文件进行读取。下面主要介绍将doc文件转化为docx文件进行读取
一、python在windows读取doc文件
这个网上很多,主要通过win32com库,将doc文件转为docx,本文主要是提取word文件里面的图片,提取内容也大同小异。下面上代码。
import os
import shutil
import zipfile
from win32com import client
# doc转docx
def doc2docx(doc_name, docx_name):
try:
# 首先将doc转换成docx
word = client.Dispatch("Word.Application")
doc = word.Documents.Open(doc_name)
# 使用参数16表示将doc转换成docx
doc.SaveAs(docx_name, 16)
doc.Close()
word.Quit()
except:
pass
'''
:param path:源文件
:param zip_path:docx重命名为zip
:param tmp_path:中转图片文件夹
:param store_path:最后保存结果的文件夹(需要手动创建)
:return:
'''
def word2pic(path, tmp_path, store_path):
# 将docx文件重命名为zip文件
#os.rename(path, zip_path)
# 进行解压
f = zipfile.ZipFile(path, 'r')
# 将图片提取并保存
for file in f.namelist():
f.extract(file, tmp_path)
# 释放该zip文件
f.close()
# 将docx文件从zip还原为docx
#os.rename(zip_path, path)
# 得到缓存文件夹中图片列表
pic = os.listdir(os.path.join(tmp_path, 'word/media'))
# 将图片复制到最终的文件夹中
for i in pic:
# 根据word的路径生成图片的名称
shutil.copy(os.path.join(tmp_path + '/word/media', i), os.path.join(store_path, i))
# 删除缓冲文件夹中的文件,用以存储下一次的文件
for i in os.listdir(tmp_path):
# 如果是文件夹则删除
if os.path.isdir(os.path.join(tmp_path, i)):
shutil.rmtree(os.path.join(tmp_path, i))
二、Linux下读取doc文件,通过libreoffice将doc文件转为docx文件,安装libreoffice,可以参考一下这个篇[安装libreoffice]
import os
import shutil
import zipfile
import subprocess
# doc转docx
def doc2docx(docPath, docxPath):
cmd = '/bin/libreoffice6.1 --headless --convert-to docx'.split() + [docPath] + ['--outdir'] + [docxPath]
p = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
p.wait(timeout=30)
stdout, stderr = p.communicate()
if stderr:
raise subprocess.SubprocessError(stderr)
'''
:param path:源文件
:param zip_path:docx重命名为zip
:param tmp_path:中转图片文件夹
:param store_path:最后保存结果的文件夹(需要手动创建)
:return:
'''
def word2pic(down_file,pic_path,file_to_pic):
tmp_path = '{}{}'.format(pic_path, '/temp')
# 将docx文件重命名为zip文件
#os.rename(path, zip_path)
# 进行解压
f = zipfile.ZipFile(down_file, 'r')
# 将图片提取并保存
for file in f.namelist():
f.extract(file, tmp_path)
# 释放该zip文件
f.close()
if os.path.isdir(os.path.join(tmp_path, 'word/media')):
# 得到缓存文件夹中图片列表
pic = os.listdir(os.path.join(tmp_path, 'word/media'))
# 将图片复制到最终的文件夹中
for i in pic:
# 根据word的路径生成图片的名称
shutil.copy(os.path.join(tmp_path + '/word/media', i), os.path.join(file_to_pic, i))
# 删除缓冲文件夹中的文件,用以存储下一次的文件
for i in os.listdir(tmp_path):
# 如果是文件夹则删除
if os.path.isdir(os.path.join(tmp_path, i)):
shutil.rmtree(os.path.join(tmp_path, i))