• python___docx模块


    一,docx模块

    Python可以利用python-docx模块处理word文档,处理方式是面向对象的。也就是说python-docx模块会把word文档,文档中的段落、文本、字体等都看做对象,对对象进行处理就是对word文档的内容处理。

    二,相关概念

    如果需要读取word文档中的文字(一般来说,程序也只需要认识word文档中的文字信息),需要先了解python-docx模块的几个概念。

    1,Document对象,表示一个word文档。
    2,Paragraph对象,表示word文档中的一个段落
    3,Paragraph对象的text属性,表示段落中的文本内容。

    三,模块的安装和导入

    需要注意,python-docx模块安装需要在cmd命令行中输入pip install python-docx,如下图表示安装成功(最后那句英文Successfully installed,成功地安装完成)

    注意在导入模块时,用的是import docx。

    也真是奇了怪了,怎么安装和导入模块时,很多都不用一个名字,看来是很有必要出一个python版本的模块管理程序python-maven了,本段纯属PS。

    四,读取word文本

    在了解了上面的信息之后,就很简单了,下面先创建一个D: empword.docx文件,并在其中输入如下内容。

    #-*- conding:utf-8 -*-
    '''
    Created on 2018年7月14日
    
    @author: Administrator
    '''
    import docx
    
    
    file=docx.Document(r"F:python从入门到放弃72wenjian.docx")
    
    print('段落:'+str(len(file.paragraphs)))
    # 
    # for para in file.paragraphs:
    #     print(para.text)
        
    for i in range(len(file.paragraphs)): 
        print(""+str(i)+"段的内容是:"+file.paragraphs[i].text)  
     1 #-*- conding:utf-8 -*-
     2 '''
     3 Created on 2018年7月14日
     4 
     5 @author: Administrator
     6 '''
     7 import sys
     8 
     9 from docx import Document
    10 from docx.shared import Inches
    11 
    12 def main():
    13 #     reload(sys)
    14 #     sys.setdefaultencoding('utf-8')
    15     
    16     # 创建文档对象
    17     document = Document()
    18     
    19     # 设置文档标题,中文要用unicode字符串
    20     document.add_heading(u'我的一个新文档',0)
    21     
    22     # 往文档中添加段落
    23     p = document.add_paragraph('This is a paragraph having some ')
    24     p.add_run('bold ').bold = True
    25     p.add_run('and some ')
    26     p.add_run('italic.').italic = True
    27     
    28     # 添加一级标题
    29     document.add_heading(u'一级标题, level = 1',level = 1)
    30     document.add_paragraph('Intense quote',style = 'IntenseQuote')
    31     
    32     # 添加无序列表
    33     document.add_paragraph('first item in unordered list',style = 'ListBullet')
    34     
    35     # 添加有序列表
    36     document.add_paragraph('first item in ordered list',style = 'ListNumber')
    37     document.add_paragraph('second item in ordered list',style = 'ListNumber')
    38     document.add_paragraph('third item in ordered list',style = 'ListNumber')
    39     
    40     # 添加图片,并指定宽度
    41     document.add_picture('cat.png',width = Inches(2.25))
    42     
    43     # 添加表格: 1行3列
    44     table = document.add_table(rows = 1,cols = 3)
    45     # 获取第一行的单元格列表对象
    46     hdr_cells = table.rows[0].cells
    47     # 为每一个单元格赋值
    48     # 注:值都要为字符串类型
    49     hdr_cells[0].text = 'Name'
    50     hdr_cells[1].text = 'Age'
    51     hdr_cells[2].text = 'Tel'
    52     # 为表格添加一行
    53     new_cells = table.add_row().cells
    54     new_cells[0].text = 'Tom'
    55     new_cells[1].text = '19'
    56     new_cells[2].text = '12345678'
    57     
    58     # 添加分页符
    59     document.add_page_break()
    60     
    61     # 往新的一页中添加段落
    62     p = document.add_paragraph('This is a paragraph in new page.')
    63     
    64     # 保存文档
    65     document.save('demo1.doc')
    66     
    67 if __name__ == '__main__':
    68     main()

    读取表格:

    #-*- conding:utf-8 -*-
    '''
    Created on 2018年7月14日
    
    @author: Administrator
    '''
    
    import docx
    
    doc = docx.Document('wenjian.docx')
    for table in doc.tables:  # 遍历所有表格
        print('----table------')
        for row in table.rows:  # 遍历表格的所有行
            # row_str = '	'.join([cell.text for cell in row.cells])  # 一行数据
            # print row_str
            for cell in row.cells:
                print(cell.text, '	',)
            print() #换行

    首先是用docx.Document打开对应的文件目录。docx文件的结构比较复杂,分为三层,1、Docment对象表示整个文档;2、Docment包含了Paragraph对象的列表,Paragraph对象用来表示文档中的段落;3、一个Paragraph对象包含Run对象的列表。 因此p.text会打印出整个的文本文档。而用doc.tables来遍历所有的表格。并且对每个表格通过遍历行,列的方式来得到所有的内容。

    但是在运行结果中并没有找到我们插入的文件对象和图片,text.txt文档。这部分该如何解析呢。首先我们需要先来认识下docx文档的格式组成:

    docx是Microsoft Office2007之后版本使用的,用新的基于XML的压缩文件格式取代了其目前专有的默认文件格式,在传统的文件名扩展名后面添加了字母“x”(即“.docx”取代“.doc”、“.xlsx”取代“.xls”、“.pptx”取代“.ppt”)。

    docx格式的文件本质上是一个ZIP文件。将一个docx文件的后缀改为ZIP后是可以用解压工具打开或是解压的。事实上,Word2007的基本文件就是ZIP格式的,他可以算作是docx文件的容器。

    docx 格式文件的主要内容是保存为XML格式的,但文件并非直接保存于磁盘。它是保存在一个ZIP文件中,然后取扩展名为docx。将.docx 格式的文件后缀改为ZIP后解压, 可以看到解压出来的文件夹中有word这样一个文件夹,它包含了Word文档的大部分内容。而其中的document.xml文件则包含了文档的主要文本内容

     

    从上面的文档我们可以了解到docx文档实际上是由XML文档打包组成的。那么我们要得到其中所有的部分,可以用ZIP解压的方式来得到所有的部件。我们先试下看是否可以

    1 将docx文档改成ZIP的后缀

    2 解压文件

    解压之后得到如下几个文件

    点开word文件夹:有如下的文件夹。document.xml就是描述文本对象的文件

    其中embeddings文件中就是我们插入的文本对象text.txt. 是一个bin文件

    Media文件中就是存储的图片:

    我们通过手动的方式将插入的文本以及图片解析出来,那么通过代码也是同样可以解析的。代码如下。

    os.chdir(r'E:py_prj')  #首先改变目录到文件的目录
    
    os.rename('test.docx','test.ZIP')  # 重命名为zip文件
    
    f=zipfile.ZipFile('test.zip','r')  #进行解压
    
    for file in f.namelist():
    
        f.extract(file)
    
    file=open(r'E:py_prjwordembeddingsoleObject1.bin','rb').read() #进入文件路径,读取二进制文件。
    
    for f in file:
    
        print f

    通过上面的方式,就可以将docx中插入的文件以及图片全部解析出来。具体docx的写的方式可以参考官方文档的介绍


    python docx 中文字体设置

    解决办法: 
    首先创建一个文档,要先声明一个document:

    from docx import Document
    document = Document()

    docx内置的样式都可以通过document.styles取到。

    正文是Normal, 标题样式根据标题声明的基本,分别从Heading 1 到Heading 9, 另外还有table、list等各种word对应的样式。可以通过遍历document.styles查看。

    我们以正文Normal为例。先来看看涉及字体更改的是style object里面的哪些属性。

    document.styles[‘Normal’].font.name

    有兴趣深入研究的同学可以看看官方文档对Font的介绍http://python-docx.readthedocs.io/en/latest/dev/analysis/features/text/font.html?highlight=font。 在这里我们只需要更改font.name。

    document.styles[‘Normal’]._element.rPr.rFonts
    

    只更改font.name是不够的,还需要调用._element.rPr.rFonts的set()方法。

    综合起来这样

    from docx.oxml.ns import qn
    
    document.styles['Normal'].font.name = u'宋体'
    document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    

      

    问题解决, 表格中字体成功更改为”宋体”.

     

     

     

     

     

  • 相关阅读:
    U盘安装Ubuntu 10.4 Server
    MySQL操作使用
    Fedora17安装MySQL及配置
    笔记:重构
    Java 并发之线程安全
    Java 并发之共享对象
    UTF8 与 UTF16 编码
    matplotlib 初使用
    用 ggplot2 在同一个图上画多条颜色不同的线
    完成情况(一)
  • 原文地址:https://www.cnblogs.com/Mengchangxin/p/9310024.html
Copyright © 2020-2023  润新知