python word排版_利用Python-docx 读写 Word 文档中的正文、表格、段落、字体等
前言:
前兩篇博客介紹了 Python 的 docx 模塊對(duì) Word 文檔的寫(xiě)操作,這篇博客將介紹如何用 docx 模塊讀取已有 Word 文檔中的信息。
本篇博客主要內(nèi)容有:
1、獲取文檔的章節(jié)信息;
2、獲取段落文本信息;
3、獲取表格內(nèi)文本信息;
4、獲取文檔內(nèi)格式信息。
1、獲取文檔章節(jié)信息:
1、用docx模塊獲取已有的word文檔對(duì)象:
from docx import Document
# Document 類,不僅可以新建word文檔,也可以打開(kāi)一個(gè)本地文檔
doc = Document(‘test03.docx‘) # 想獲取的文檔文件名,這里是相對(duì)路徑。
用做示例的 test03.docx 文件截圖如下:
文檔中有兩個(gè)章節(jié)共兩頁(yè)(一個(gè)章節(jié)一頁(yè)),一個(gè)章節(jié)的頁(yè)面為 A3 ,另一個(gè)為 A4。
2、獲取文檔章節(jié)信息:
# 獲取文檔所有章節(jié)
sections = doc.sections
"class Sections(Sequence):"
print(sections)
#
# 查看章節(jié)數(shù)量
print(len(sections)) # 2
注意:
章節(jié)對(duì)象的概念雖然比段落對(duì)象大,章節(jié)對(duì)象可以設(shè)置本章節(jié)的頁(yè)面大小頁(yè)眉頁(yè)腳等,在該章節(jié)的段落對(duì)象必須遵守該章節(jié)的設(shè)置。
但是又并不存在包含關(guān)系,也就是說(shuō)不能通過(guò)章節(jié)對(duì)象獲取到段落信息。
3、獲取頁(yè)邊距等信息:
# 獲取章節(jié)對(duì)象的頁(yè)邊距等信息
sec0 = sections[0]
"class Section(object):"
‘‘‘
官方解釋:文檔節(jié),提供對(duì)節(jié)和頁(yè)面設(shè)置的訪問(wèn)。
還提供對(duì)頁(yè)眉和頁(yè)腳的訪問(wèn)。
‘‘‘
print(sec0)
#
# 獲取章節(jié)頁(yè)面信息
# 獲取頁(yè)面邊距值:(單位為像素)
print(‘左邊距:‘,sec0.left_margin)
# 左邊距: 914400
print(‘右邊距:‘,sec0.right_margin)
# 右邊距: 914400
print(‘上邊距:‘,sec0.top_margin)
# 上邊距: 1143000
print(‘下邊距:‘,sec0.bottom_margin)
# 下邊距: 1143000
print(‘頁(yè)眉邊距:‘,sec0.header_distance)
# 頁(yè)眉邊距: 540385
print(‘頁(yè)腳邊距:‘,sec0.footer_distance)
# 頁(yè)腳邊距: 629920
print(‘頁(yè)面方向:‘,sec0.orientation)
# 頁(yè)面方向: LANDSCAPE (1)
print(‘頁(yè)面高度:‘,sec0.page_height)
# 頁(yè)面高度: 10657205
print(‘頁(yè)面寬度:‘,sec0.page_width)
# 頁(yè)面寬度: 15085695
這里獲取的是第一個(gè)章節(jié)的頁(yè)面信息,也就是 A3 頁(yè)面的信息。
注:上一篇博客 往Word文檔中插入圖片、表格,設(shè)置表格樣式,章節(jié),頁(yè)眉頁(yè)腳等,在介紹設(shè)置頁(yè)面信息時(shí),忘記介紹如何設(shè)置頁(yè)面方向了,這里補(bǔ)充一下:
設(shè)置頁(yè)面方向:
# 導(dǎo)入設(shè)置頁(yè)面方向所需模塊
from docx.enum.section import WD_ORIENT
# 獲取章節(jié)對(duì)象
section = document.sections[0]
# 設(shè)置頁(yè)面方向
section.orientation = WD_ORIENT.LANDSCAPE # 橫向
可設(shè)置項(xiàng)有橫向( LANDSCAPE ) 和縱向 ( PORTRAIT ):
‘‘‘
‘PORTRAIT‘, 0, ‘portrait‘, ‘Portrait orientation.‘
‘LANDSCAPE‘, 1, ‘landscape‘, ‘Landscape orientation.‘
‘‘‘
文檔截圖:
4、獲取文檔頁(yè)眉頁(yè)腳信息:
head0 = sec0.header # 獲取頁(yè)眉對(duì)象
print(head0)
#
head0_pars = head0.paragraphs # 獲取 頁(yè)眉 paragraphs
# 獲取頁(yè)眉文字信息
# 因存在多個(gè) paragraph 對(duì)象的可能所以用循環(huán)讀取的方式
head0_string = ‘‘
for par in head0_pars:
head0_string += par.text
print(head0_string)
# 儀征市馬集鎮(zhèn)總體規(guī)劃(2017-2030)——說(shuō)明
# 獲取頁(yè)腳信息,也是類似的方法
foot0 = sec0.footer
print(foot0) # 獲取頁(yè)腳對(duì)象
#
foot0_pars = foot0.paragraphs
foot0_string = ‘‘
for par in foot0_pars:
foot0_string += par.text
print(foot0_string)
# 1
2、獲取段落文字信息:
1、獲取Word文檔所有段落對(duì)象:
"獲取文檔所有段落信息:"
# 獲取文檔所有段落對(duì)象
paragraphs = doc.paragraphs
注意:
paragraphs 獲取的是文檔中所有段落對(duì)象的列表,嚴(yán)格來(lái)說(shuō)是word文檔中正文部分的段落對(duì)象列表。因?yàn)橥ㄟ^(guò)前文的介紹,許多除正文部分,如 表格,頁(yè)面頁(yè)腳等元素也包含 paragraph 對(duì)象。
而 doc.paragraphs 獲取到的 paragraph 不包含這些段落對(duì)象。
2、獲取段落對(duì)象文字信息:
print(paragraphs)
print(len(paragraphs)) # 打印結(jié)果:20
# 獲取一個(gè)段落對(duì)象的文字信息
par0 = paragraphs[0]
print(par0)
par0_string = par0.text
print(par0_string)
# 獲取所有段落文字信息
pars_string = [par.text for par in paragraphs]
print(pars_string)
par0_string 打印截圖:
3、獲取段落格式信息:
print(‘段落對(duì)齊方式:‘,par0.paragraph_format.alignment)
# 段落對(duì)齊方式: LEFT (0)
print(‘左縮進(jìn):‘,par0.paragraph_format.left_indent)
# 左縮進(jìn): None
print(‘右縮進(jìn):‘,par0.paragraph_format.right_indent)
# 右縮進(jìn): None
print(‘首行縮進(jìn):‘,par0.paragraph_format.first_line_indent)
# 首行縮進(jìn): 304800
print(‘行間距:‘,par0.paragraph_format.line_spacing)
# 行間距: 1.5
print(‘段前間距:‘,par0.paragraph_format.space_before)
# 段前間距: 198120
print(‘段后間距:‘,par0.paragraph_format.space_after)
# 段后間距: 198120
3、獲取文字格式信息:
paragraph 對(duì)象 里還有更小的 run 對(duì)象,run 對(duì)象才包含了段落對(duì)象的文字信息。
paragraph.text 方法也是通過(guò) run 對(duì)象的方法獲取到文字信息的:
paragraph.text 方法源碼:
def text(self):
text = ‘‘
for run in self.runs:
text += run.text
return text
文字的字體、大小、下劃線等信息都包含在 run 對(duì)象中(不清楚的看前面的博客):
# 獲取段落的 run 對(duì)象列表
runs = par0.runs
print(runs)
# 獲取 run 對(duì)象
run_0 = runs[0]
print(run_0.text) # 獲取 run 對(duì)象文字信息
# 打印結(jié)果:
# 堅(jiān)持因地制宜,差異化打造特色小鎮(zhèn),
文檔 段落 和 run 對(duì)象示意:
獲取文字格式信息:
# 獲取文字格式信息
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(‘下標(biāo):‘,run_0.font.subscript)
# 下標(biāo): None
print(‘上標(biāo):‘,run_0.font.superscript)
# 上標(biāo): None
注:前面的博客好像也沒(méi)介紹文字背景顏色的設(shè)置…
背景顏色設(shè)置方法: (與字體顏色設(shè)置方法有區(qū)別)
# 設(shè)置背景顏色
from docx.enum.text import WD_COLOR_INDEX
run_2.font.highlight_color = WD_COLOR_INDEX.YELLOW
背景顏色可選值有:
‘‘‘
‘AUTO‘, 0, ‘default‘
‘BLACK‘, 1, ‘black‘
‘BLUE‘, 2, ‘blue‘
‘BRIGHT_GREEN‘, 4, ‘green‘,
‘DARK_BLUE‘, 9, ‘darkBlue‘,
‘DARK_RED‘, 13, ‘darkRed‘
‘DARK_YELLOW‘, 14, ‘darkYellow‘
‘GRAY_25‘, 16, ‘lightGray‘
‘GRAY_50‘, 15, ‘darkGray‘
‘GREEN‘, 11, ‘darkGreen‘
‘PINK‘, 5, ‘magenta‘
‘RED‘, 6, ‘red‘
‘TEAL‘, 10, ‘darkCyan‘
‘TURQUOISE‘, 3, ‘cyan‘
‘VIOLET‘, 12, ‘darkMagenta‘
‘WHITE‘, 8, ‘white‘
‘YELLOW‘, 7, ‘yellow‘
‘‘‘
4、獲取文檔中表格信息:
示例文檔中表格截圖:
1、獲取表格樣式、單元格對(duì)象及文字信息:
# 獲取文檔中表格信息
tables = doc.tables # 獲取文檔中所有表格對(duì)象的列表
print(tables)
# []
print(len(tables)) # 查看文檔中表格數(shù)量
# 1
table0 = tables[0] # 獲取表格對(duì)象
# 獲取表格的樣式信息
print(table0.style)
# _TableStyle(‘Normal Table‘) id: 190621384
# 獲取一個(gè)表格的所有單元格
cells = table0._cells
print(len(cells)) # 表格中單元格數(shù)量
# 15
# 獲取單元格內(nèi)所有文字信息
cells_string = [cell.text for cell in cells]
print(cells_string)
cells_string 打印截圖:
從截圖中可以看出來(lái),用 tableobj._cells 獲取到的單元格對(duì)象列表是按行排列的。
2、獲取表格的行列對(duì)象:
# 獲取表格對(duì)象行數(shù)量、列數(shù)量
col_num = len(table0.columns)
print(col_num) # 3
# 行數(shù)量
row_num = len(table0.rows)
print(row_num) # 5
# 獲取行對(duì)象
row0 = table0.rows[0]
# 獲取列對(duì)象
col0 = table0.columns[0]
# 獲取行對(duì)象文字信息
‘要用 row0.cells 獲取行對(duì)象的 cell 才能獲取其文字信息‘
row0_string = [cell.text for cell in row0.cells]
print(row0_string)
# 獲取列對(duì)象文字信息
col0_string = [cell.text for cell in col0.cells]
print(col0_string
注:在介紹單元格格式信息時(shí),說(shuō)過(guò)單元格內(nèi)文字信息也是通過(guò) run 對(duì)象設(shè)置,故獲取文字信息也和前面獲取段落文字信息類似,就不重復(fù)講了。
結(jié)尾:
以上就是本篇博客的全部?jī)?nèi)容了,后面將會(huì)用兩個(gè)實(shí)例來(lái)將前面三篇博客的知識(shí)點(diǎn)串聯(lián)起來(lái),感謝閱讀。
該專欄會(huì)對(duì) Python 的第三方模塊,如:xlwt,xlrd,python-docx等,操作 Office 辦公軟件(Word Excel PPT)的方法進(jìn)行詳細(xì)講解。同時(shí)也會(huì)搭配一些實(shí)例演練,一方面強(qiáng)化知識(shí)點(diǎn)的理解與運(yùn)用,另一方面也希望能起到,引導(dǎo)讀者進(jìn)行思考:如何用 python 提高 offic 辦公軟件辦公效率的作用。
感興趣的朋友,可以點(diǎn)個(gè) 關(guān)注 或 收藏 。如在博客中遇到任何問(wèn)題或有一些想法、需求,可留言或私信。
創(chuàng)作不易,你的支持是我最大的動(dòng)力,感謝 !
原文地址:https://www.cnblogs.com/cnchemmy/p/13266233.html
總結(jié)
以上是生活随笔為你收集整理的python word排版_利用Python-docx 读写 Word 文档中的正文、表格、段落、字体等的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab中建立水火电站模型,基于MA
- 下一篇: 用python做频数分析_Python统