python读写 doc文件和docx文件

背景:

Python 中可以读取 word 文件的库有 python-docx 和 pywin32。

优点缺点python-docx跨平台只能处理 .docx 格式,不能处理.doc格式pywin32仅限 windows 平台.doc 和 .docx 都能处理。

一. pywin32模块

这个库很强大,不仅仅可以读取 word,但是网上介绍用 pywin32 读取 .doc 的文章真不多,因为,真心不好用。

以下是 pywin32 读取 .doc 的代码示例,但是读取表格有问题,输出全是空,原因不明,因为不打算用所以没有深入研究。另外,如果表格中有纵向合并单元格,会报错:“无法访问此集合中单独的行,因为表格有纵向合并的单元格。”

1.将doc转为docx

python3.8中win32com 要安装pypiwin32 pip install pypiwin32

 

from win32com import client as wc

word = wc.Dispatch("Word.Application")
doc = word.Documents.Open(路径+名称.doc)
doc.SaveAs(路径+名称.docx, 12)   12为docx
doc.Close()
word.Quit()

2.读取段落

import docx
docStr = Document(docName)   打开文档
for paragraph in docStr.paragraphs:
parStr = paragraph.text
--》paragraph.style.name == 'Heading 1'  一级标题   
--》paragraph.paragraph_format.alignment == 1  居中显示
--》paragraph.style.next_paragraph_style.paragraph_format.alignment == 1  下一段居中显示
--》paragraph.style.font.color

3.读取表格

numTables = docStr.tables
for table in numTables:
#行列个数
row_count = len(table.rows)
col_count = len(table.columns)
for i in range(row_count):
    row = table.rows[i].cells
	i行j列内容:row[j].text

或者:
row_count = len(table.rows)
col_count = len(table.columns)
for i in range(row_count):
    for j in range(col_count):
        print(table.cell(i,j).text)

4.按样式读取

读取标题

for p in doc.paragraphs:
    if p.style.name=='Heading 1':
        print(p.text)
import re
for p in doc.paragraphs:
    if re.match("^Heading \d+$",p.style.name):
        print(p.text)

读取正文

for p in doc.paragraphs:
    if p.style.name=='Normal':
        print(p.text)

获取docx支持的样式

from docx.enum.style import WD_STYLE_TYPE
for i in s:
    if i.type==WD_STYLE_TYPE.PARAGRAPH:
        print(i.name)

5.获取文字格式信息

paragraph 对象 里还有更小的 run 对象,run 对象才包含了段落对象的文字信息。
paragraph.text 方法也是通过 run 对象的方法获取到文字信息的:

paragraph.text 方法源码:

def text(self):
     text = ''
        for run in self.runs:
            text += run.text
        return text

文字的字体、大小、下划线等信息都包含在 run 对象中(不清楚的看前面的博客):

获取段落的 run 对象列表
runs = par0.runs
print(runs)
获取 run 对象
run_0 = runs[0]
print(run_0.text) # 获取 run 对象文字信息
打印结果:
坚持因地制宜,差异化打造特色小镇,
文档 段落 和 run 对象示意:
获取文字格式信息:

# 获取文字格式信息
print('字体名称:',run_0.font.name)
# 字体名称: 宋体
print('字体大小:',run_0.font.size)
# 字体大小: 152400
print('是否加粗:',run_0.font.bold)
# 是否加粗: None
print('是否斜体:',run_0.font.italic)
# 是否斜体: True
print('字体颜色:',run_0.font.color.rgb)
# 字体颜色: FF0000
print('字体高亮:',run_0.font.highlight_color)
# 字体高亮: YELLOW (7)
print('下划线:',run_0.font.underline)
# 下划线: True
print('删除线:',run_0.font.strike)
# 删除线: None
print('双删除线:',run_0.font.double_strike)
# 双删除线: None
print('下标:',run_0.font.subscript)
# 下标: None
print('上标:',run_0.font.superscript)
# 上标: None
LIK2

6.设置首行缩进

from docx.shared import Inches,Pt
par2 = doc.add_paragraph('段落文本')
# 左缩进,0.5 英寸
par2.paragraph_format.left_indent = Inches(0.5)
# 右缩进,20 磅
par2.paragraph_format.right_indent = Pt(20)
# 首行缩进
par2.paragraph_format.first_line_indent = Inches(1)

查看首行缩进单位

from docx import Document
from docx.shared import Inches
from docx.oxml.ns import qn

from docx.shared import Cm, Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

from docx.shared import RGBColor

myDocument = Document('2020年建交集团3月分析报告.docx')

for paragraph in myDocument.paragraphs:
	print(paragraph.paragraph_format.first_line_indent)
	print(dir(paragraph))

批量的读取doc文档】

解决方案:利用python将大批.doc文件转化为.docx文件,再读写.docx文件

问题分析:python利用python-docx (0.8.6)库可以读取.docx文件或.txt文件,且一路畅通无阻,而对.doc文件本身python是无能为力的,那有很多同学就不服气,我手动把.doc文件的后缀名改为.docx或.txt不就解决问题了吗?答案是不能的,简单修改后缀名,那么文件就被你玩坏了,别说打不开,就是打开也是天书啊(乱码)。python无法操作.doc文件是他的先天不足,但是我们不要钻牛角尖一定要在互联网上找到一种源码直接读取.doc文件,一调用就好了,但是不幸的是,你可能在网上也找不到解决方案。正当我一筹莫展之时,我将.doc文档利用手动的方式“另存为”.docx文档,就能够成功打开转化后的.docx文档,于是我就尝试利用代码方式完成这个手动的“另存为”功能,问题得以解决。

直接上python代码(首先你需要先安装pypewin32库):

# -*- coding: utf-8 -*-:
import sys
import pickle
import re
import codecs
import string
import shutil
from win32com import client as wc

def doSaveAas(): # 想批处理文件,你就用for循环呗,我一次性处理了100多个文件,代码执行不超过2分钟,可以解决问题,目标文件路径可以自由改动,大家注意SaveAs方法中的参数,好多啊,别写错了

word = wc.Dispatch('Word.Application')
doc = word.Documents.Open(u'C:\\Users\\X\\PycharmProjects\\1\\大家好.doc')  # 目标路径下的文件
doc.SaveAs(u'C:\\Users\\X\\PycharmProjects\\1\\我是一枚小小的程序员X007.docx', 12, False, "", True, "", False, False, False, False) # 转化后路径下的文件 
doc.Close()
word.Quit()

 

参考摘取原文:https://www.sohu.com/a/281740874_99987664(感谢大佬)

       https://www.cnblogs.com/zhaobowen/p/13807092.html(感谢大佬)

       https://www.jb51.net/article/139671.htm(感谢大佬)

【python】后缀为doc的文件读取 - 代码小绵羊 - 博客园

<think>嗯,用户想用Python批量把docdocx文件转成PDF。首先,我得考虑这两种格式的处理方法。因为doc是旧版的Word格式,而docx是新的Office Open XML格式,可能需要不同的库来处理。 对于docx文件Python有个python-docx库,不过这个库主要是用来读取写入docx文件的,好像不支持直接转PDF。可能需要用COM接口调用Word程序来转换,但这样在非Windows系统或者没有安装Word的情况下就不行了。或者有没有其他第三方工具呢?比如LibreOffice的命令行工具,不过用户可能希望纯Python的解决方案。 然后doc文件就更麻烦了,因为doc是二进制格式,处理起来更复杂。可能需要用pywin32来调用Word的COM接口,但同样依赖于本地的Word安装。另外,有没有跨平台的方法?或者有没有其他库可以处理?比如unoconv,但这也需要LibreOffice的支持。 用户提到批量转换,所以可能需要遍历目录下的所有docdocx文件,然后逐个处理。需要处理文件路径,输入输出路径的设置。还有错误处理,比如文件损坏或者无法转换的情况。 然后想到,可能有一个库叫comtypes,可以在Windows下调用Word的COM接口,实现转换。而对于macOS或者Linux,可能需要使用LibreOffice的命令行模式,比如soffice --convert-to pdf。不过这样就需要在代码中判断操作系统,然后执行不同的命令。 或者有没有其他方法?比如用Aspose.Words,但这个是商业库,可能用户不想用。或者用docx2pdf这个第三方库,看起来它封装了comtypesLibreOffice的操作,可能更方便一些。 不过需要确认这个库是否支持doc文件,因为docx2pdf可能只处理docx。如果是的话,可能需要分开处理docdocx,或者找其他方法处理doc文件。 总结一下步骤可能是: 1. 安装必要的库,比如docx2pdfpywin32或者comtypes来处理docx,以及处理doc可能需要不同的库。 2. 遍历指定目录,找到所有docdocx文件。 3. 对于每个文件,调用Word的COM接口或者LibreOffice的命令行工具进行转换。 4. 处理异常,确保程序健壮性。 但具体怎么实现呢?比如在Python中调用Word的COM接口,可能需要使用win32com.client模块。比如打开Word应用,然后打开文档,另存为PDF,然后关闭。 对于docx2pdf库,可能只需要简单的函数调用,但可能内部也是调用COM接口。或者像这个例子: from docx2pdf import convert convert("input.docx", "output.pdf") 但是是否支持批量转换呢?可能可以传入文件夹路径。或者自己写循环。 对于doc文件,可能需要同样的方法,因为Word的COM接口支持打开doc文件。所以不管扩展名是doc还是docx,都可以用同样的方法处理。 所以可能的解决方案是,使用win32com.client来操作Word,遍历文件,然后逐个转换。 但是需要注意,Word可能在后台打开,需要确保最后关闭,否则会有进程残留。另外,可能需要处理文件路径中的空格,用绝对路径。 另外,转换后的PDF文件名可能需要与原文件同名,只是扩展名不同,所以需要处理输出路径。 然后代码的大致结构可能是: 导入必要的模块,如os, win32com.client 定义转换函数,接受输入路径输出文件夹。 在函数内,创建Word应用对象,打开文档,然后另存为PDF格式(17),关闭文档。 然后遍历文件夹,收集所有docdocx文件,调用转换函数。 处理异常,例如文件无法打开,或者权限问题等。 此外,可能还需要考虑多线程或异步处理,如果文件很多,加速转换过程。 不过用户可能只需要基本的批量转换,所以先提供简单可靠的方案。 然后,可能还需要考虑是否安装Word,如果在服务器环境或者Linux下,这种方法就不行,需要其他方案,比如LibreOffice。但用户的问题可能是在Windows环境下。 所以综合起来,给出两种方法:一种使用python-docxdocx2pdf库,另一种使用win32com.client。不过可能后者更全面,能处理docdocx。而前者可能只能处理docx。 所以最终的步骤可能是: 1. 安装pywin32库。 2. 编写代码,用win32com.client调用Word进行转换。 3. 遍历文件夹,处理所有docdocx文件。 同时,给出代码示例,并说明注意事项,比如需要安装Word,以及关闭后台进程等。 可能还需要处理Word的警告弹窗,比如在代码中设置不显示对话框。 这样用户就可以实现批量转换了。</think>以下是将`.doc``.docx`文件批量转换为PDF的Python实现方法,分为两种常见方案: --- ### **方法1:使用 `win32com` 调用本地Word程序(仅限Windows)** **原理**:通过Windows的COM接口调用Microsoft Word应用程序实现格式转换。 #### **步骤** 1. **安装库**: ```bash pip install pywin32 ``` 2. **核心代码**: ```python import os import win32com.client def convert_to_pdf(input_path, output_folder): word = win32com.client.Dispatch("Word.Application") word.Visible = False # 后台运行 doc = word.Documents.Open(input_path) file_name = os.path.splitext(os.path.basename(input_path))[0] output_path = os.path.join(output_folder, f"{file_name}.pdf") doc.SaveAs(output_path, FileFormat=17) # 17对应PDF格式 doc.Close() word.Quit() # 批量转换 input_folder = "your/input/folder" output_folder = "your/output/folder" for file in os.listdir(input_folder): if file.endswith((".doc", ".docx")): convert_to_pdf(os.path.join(input_folder, file), output_folder) ``` #### **注意事项** - 需安装Microsoft Word,否则报错。 - 转换后手动终止`WINWORD.EXE`进程(Word可能未完全退出)。 --- ### **方法2:使用 `docx2pdf` 库(跨平台但依赖LibreOffice)** **原理**:利用LibreOffice的无界面模式进行转换,支持Windows/macOS/Linux。 #### **步骤** 1. **安装库工具**: - 安装LibreOffice:https://www.libreoffice.org/ - 安装Python库: ```bash pip install docx2pdf ``` 2. **核心代码**: ```python from docx2pdf import convert input_folder = "your/input/folder" output_folder = "your/output/folder" convert(input_folder, output_folder) ``` #### **注意事项** - 默认转换文件夹内所有`.docx`文件,`.doc`需手动处理。 - 若需包含`.doc`文件,需额外代码遍历文件并调用LibreOffice命令行。 --- ### **扩展:处理旧版`.doc`文件(通用方法)** ```python import os def convert_doc_to_pdf(input_path, output_folder): # 调用LibreOffice命令行(跨平台) cmd = f'libreoffice --headless --convert-to pdf "{input_path}" --outdir "{output_folder}"' os.system(cmd) # 遍历文件夹并转换.doc文件 for file in os.listdir(input_folder): if file.endswith(".doc"): convert_doc_to_pdf(os.path.join(input_folder, file), output_folder) ``` --- ### **方案对比** | 方法 | 优点 | 缺点 | |------------|-----------------------|-------------------------------| | `win32com` | 速度快,兼容性好 | 依赖Microsoft Word,仅限Windows | | `docx2pdf` | 跨平台,无需商业软件 | 需安装LibreOffice,`.doc`需额外处理 | 根据实际环境选择方案,若需完整代码或进一步优化可补充具体需求!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值