这也是 Automate The Boring Stuff With Python 上面的内容,书里面本来是和上一部分 PDF 相关内容放在一起的。
处理 Word 文件的库叫做 python-docx, 然而这个库导入的时候叫做 docx; 对的名字并不一致。安装的时候使用 pip install python-docx, 而导入的时候使用:
import docx
这里也要说明一下 Word 里面的结构:
- 整个文档是 Document
- Document 当中包括不同数量的 Paragraph 对象
- 每一个 Paragraph 对象当中有若干个 Run
至于 Run 则是一个 Paragraph 当中,遇到格式改变时候的部分;例如:
This is a big and sweet apple.
这里面就有 5 个 Run, 分别是 “This is a “, “big”, ” and “, “sweet” 和 ” apple.”
打开文件抽取文字
doc = docx.Document('demo.docx') # 打开一个 Word 文件 print(len(doc.paragraphs)) # 计算有多少个 Paragraph print(doc.paragraphs[0].text) # 显示第一个 Paragraph 的文字 print(doc.paragraphs[1].text) # 显示第二个 Paragraph 的文字 print(len(doc.paragraphs[1].runs)) # 显示第二个 Paragraph 有多少个 Run print(doc.paragraphs[1].runs[0].text) # 显示第二个 Paragraph 的第一个 Run 的文字 print(doc.paragraphs[1].runs[1].text) # 显示第二个 Paragraph 的第二个 Run 的文字 print(doc.paragraphs[1].runs[2].text) # 显示第二个 Paragraph 的第三个 Run 的文字 print(doc.paragraphs[1].runs[3].text) # 显示第二个 Paragraph 的第四个 Run 的文字
打开文件抽取所有文字
def getText(filename): # 定义函数,需要 filename 作为输入 doc = docx.Document(filename) # 打开目标 Word 文件 fullText = [] # 创建一个空白列表用于储存文字 for paragraph in doc.paragraphs: # 遍历文档当中的每一个 Paragraph fullText.append(paragraph.text) # 把 Paragraph 的文字新加到空白列表当中 return '\n'.join(fullText) # 把整个列表用回车连接起来 print(getText('demo.docx')) # 调用函数
改变样式
Word 当中的样式包括三种:
- Paragraph 样式,应用到 Paragraph 对象
- Character 样式,应用到 Run 对象
- Linked 样式,应用到 Paragraph 和 Run 对象;然而应用到 Run 对象的时候,应该在样式名称后面加上 Char, 例 runObj.style = ‘Quote Char‘
python-docx 没办法创建样式,只能设定自带和文档里面特有的样式;如果需要,在 Word 里面新建一个样式然后再去引用。
Word 自带以下样式:
- ‘Normal’
- ‘Body Text’
- ‘Body Text 2’
- ‘Body Text 3’
- ‘Caption’
- ‘Heading 1’
- ‘Heading 2’
- ‘Heading 3’
- ‘Heading 4’
- ‘Heading 5’
- ‘Heading 6’
- ‘Heading 7’
- ‘Heading 8’
- ‘Heading 9’
- ‘Intense Quote’
- ‘List’
- ‘List 2’
- ‘List 3’
- ‘List Bullet’
- ‘List Bullet 2’
- ‘List Bullet 3’
- ‘List Continue’
- ‘List Continue 2’
- ‘List Continue 3’
- ‘List Number ‘
- ‘List Number 2’
- ‘List Number 3’
- ‘List Paragraph’
- ‘MacroText’
- ‘No Spacing’
- ‘Quote’
- ‘Subtitle’
- ‘TOC Heading’
- ‘Title’
至于 Run 对象的属性还有更多:
- bold: 粗体
- italic: 斜体
- underline: 下划线
- strike: 删除线
- double_strike: 双重删除线
- all_caps: 全部大写(注意这个是看起来全部大写,实际上的文字还是本来的大小写)
- small_caps: 小型大写(本来小写的字母变成大写字母的样子,但是比普通大写字母要小)
- shadow: 添加阴影
- outline: 添加外边框
- rtl: 从右到左的书写顺序
- imprint: 阴文,刻入的效果
- emboss: 阳文,浮起来的效果
doc = docx.Document('demo.docx') # 打开指定文件 print(doc.paragraphs[0].text) # 查看第一个 Paragraph 的文字 print(doc.paragraphs[0].style) # 查看第一个 Paragraph 的样式 doc.paragraphs[0].style = 'Normal' # 把第一个 Paragraph 的样式设置为 Normal print(doc.paragraphs[1].text) # 查看第二个 Paragraph 的文字 for run in doc.paragraphs[1].runs: # 遍历第二个 Paragraph 的每一个 Run print(run.text) # 查看文字 doc.paragraphs[1].runs[0].style = 'QuoteChar' # 把第二个 Paragraph 的第一个 Run 的样式设置为 Quote, 因为应用在 Run 上面的缘故所以需要后面加上 Char doc.paragraphs[1].runs[1].underline = True # 把第二个 Paragraph 的第二个 Run 设置下划线 doc.paragraphs[1].runs[4].underline = True # 把第二个 Paragraph 的第五个 Run 设置下划线 doc.save('restyled.docx') # 保存文件
写入 Word 文件
新嘉 Paragraph 用 add_paragraph
doc = docx.Document() # 新建一个 Document 对象 doc.add_paragraph('Hello, world!') # 增加一个 Paragraph, 并指定其内容 doc.save('helloworld.docx') # 保存文件
新加 Run 用 add_run
doc = docx.Document() # 新建一个 Document 对象 doc.add_paragraph('Hello world!') # 增加一个 Paragraph, 并指定其内容 -> 只能增加在 Document 的最后 paragraphObject1 = doc.add_paragraph('This is asecond paragraph.') # 增加一个 Paragraph, 并指定其变量名和内容 paragraphObject2 = doc.add_paragraph('This is a yet another paragraph.') # 增加一个 Paragraph, 并指定其变量名和内容 paragraphObject1.add_run(' This text is being added to the second paragraph.') # 给指定 Paragraph 变量增加一个 Run, 并指定其内容 -> 只能增加在 Paragraph 的最后 doc.add_paragraph('Hello, world!', 'Title') # 增加一个 Paragraph, 并指定其内容和样式 doc.save('multipleParagraphs.docx') # 保存文件
新加标题用 add_heading
doc = docx.Document() # 新建一个 Document 对象 for i in range(5): # 从 0 到 4 遍历 doc.add_heading(f'Header {i}', i) # 增加标题;0 则和 Title 样式一样 doc.save('headings.docx') # 保存文件
新加分页符用 add_break(docx.enum.text.WD_BREAK.PAGE)
doc = docx.Document() # 新建一个 Document 对象 doc.add_paragraph('This is on the first page!') # 写入一个 Paragraph doc.paragraphs[0].runs[0].add_break(docx.enum.text.WD_BREAK.PAGE) # 在第一个 Paragraph 的第一个 run 后面加入一个分页符;如果参数则是普通的分隔符 doc.add_paragraph('This is on the second page!') # 在第二页写入一个 Paragraph doc.save('twoPage.docx') # 保存文件
新加图片用 add_picture
doc = docx.Document() # 新建一个 Document 对象 doc.add_picture('zophie.png', width = docx.shared.Inches(1), height = docx.shared.Cm(4)) # 插入一个图片,并指定尺寸 doc.save('zophie.docx') # 保存文件
新加表格用 add_table
from docx.enum.table import WD_TABLE_ALIGNMENT doc = docx.Document() # 新建一个 Document 对象 table = doc.add_table(3,4) # 增加一个 3 行乘以 4 列的 table table.alignment = WD_TABLE_ALIGNMENT.CENTER # 中间对齐 table table.cell(1,2).add_paragraph('hello!') # 第 2 行第 3 列另起一行写入文字 table.cell(2,3).text ='world!' # 第 3 行第 4 列写入文字 doc.save(table.docx') # 保存文件
平时 Word 需要用得比较多还是和表格打交道,还是得多看一下表格怎么处理格式等等了。