python-docx模块虽然强大,但却不能处理后缀为".doc"的word文件。如果强制读取doc文件,将会报如下错误。
import docx #导入docx库
doc = docx.Document("data/公司001合同.doc") #打开word文件
for para in doc.paragraphs: #读取word中的每个段落
print(para.text)
>>>
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-3-4a254209689d> in <module>
1 import docx #导入docx库
----> 2 doc = docx.Document("data/公司001合同.doc") #打开word文件
3 for para in doc.paragraphs: #读取word中的每个段落
4 print(para.text)
d:\python\lib\site-packages\docx\api.py in Document(docx)
26 if document_part.content_type != CT.WML_DOCUMENT_MAIN:
27 tmpl = "file '%s' is not a Word file, content type is '%s'"
---> 28 raise ValueError(tmpl % (docx, document_part.content_type))
29 return document_part.document
30
ValueError: file 'data/公司001合同.doc' is not a Word file, content type is 'application/vnd.openxmlformats-officedocument.themeManager+xml'
此时需要将“.doc”文件另存为“.docx”文件。然后就可以让python-docx模块尽情发挥了。手动另存为,需要逐个打开doc文件,然后点击“文件”->“另存为”,在弹出的“另存为”对话框中,将“保存类型”选择为“.docx”类型,然后保存。如果有100个文件,那得操作100次,很费时间。python提供了win32com
模块(应安装pypiwin32模块,win32com包含在其中,即使用命令"pip install pypiwin32"),其中的SaveAs
方法可以代替人手批量将文件另存为我们需要的格式。
首先,我们使用os
模块,获取需要做“另存为”操作的文件所在路径。由于后面的win32com模块在处理文件的时候,需要绝对路径,不然程序会报错说“找不到文件”。所以此处需要获取待处理文件的绝对路径,即从根目录开始的路径,注意文件夹层级使用两个反斜杠"\",其中一个斜杠是另一个的转义。
import os #用于获取目标文件所在路径
path="C:\\Users\\dywei\\python\\python_excel\\Exp15.Convert doc to docx\\data\\" # 文件夹绝对路径
files=[]
for file in os.listdir(path):
if file.endswith(".doc"): #排除文件夹内的其它干扰文件,只获取".doc"后缀的word文件
files.append(path+file)
files
>>
['C:\\Users\\dywei\\python\\python_excel\\Exp15.Convert doc to docx\\data\\公司001合同.doc',
'C:\\Users\\dywei\\python\\python_excel\\Exp15.Convert doc to docx\\data\\公司002合同.doc',
'C:\\Users\\dywei\\python\\python_excel\\Exp15.Convert doc to docx\\data\\公司003合同.doc',
'C:\\Users\\dywei\\python\\python_excel\\Exp15.Convert doc to docx\\data\\公司004合同.doc',
'C:\\Users\\dywei\\python\\python_excel\\Exp15.Convert doc to docx\\data\\公司005合同.doc']
然后就可以导入win32com模块,使用Dispatch("Word.Application")
打开word应用程序,然后再逐个打开doc文件doc = word.Documents.Open(file)
,使用SaveAs
另存文件为"docx"后缀的文件,另存之后,关闭打开的doc文件,再处理下一个,直到结束。我们保存新文件的时候,还是保持到原文件路径,只是将后缀改为".docx","{}x".format(file)
指将在原文件名的末尾加上“x”。如下代码直接拿来使用即可,就不用浪费时间去深究其内部函数的构造了。有用,能解决问题就是硬道理。
from win32com import client as wc #导入模块
word = wc.Dispatch("Word.Application") # 打开word应用程序
for file in files:
doc = word.Documents.Open(file) #打开word文件
doc.SaveAs("{}x".format(file), 12)#另存为后缀为".docx"的文件,其中参数12指docx文件
doc.Close() #关闭原来word文件
word.Quit()
print("完成!")
>>
完成!
批量“另存为”的结果如下所示。若需要将docx文件另存为doc文件,也可用类似的方法。
所有源代码和说明都在Jupyter notebook上完成,所用到的代码及Excel 资料已上传GitHub及百度网盘, 欢迎Fork或下载到本地随意玩。。。转载请注明出处,谢谢。
GitHub链接:
https://github.com/weidylan/Office_Automation_by_Using_Python
百度网盘:链接: pan.baidu.com/s/1JjW_ke 提取码: z8nk
知乎专栏:Python操作Office软件高效工作