用python解析word文件(1)-docx文档格式组成

docx文档格式组成

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

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

word目录下:

document.xml文件内容:

media目录下存放word文档中插入的图片:

所以,我们可以使用手工的方法编辑文件document.xml来对该word文档内容进行编辑,或是提取文档media中图片文件的方式来提取该word文档中所插入的所有图片。

例子: 获取docx中文件列表信息

import zipfile

‘‘‘获取解压后的文件信息‘‘‘

def getinfo(wordfile):

    f=zipfile.ZipFile(wordfile,‘r‘)

    for filename in f.namelist():

        f.extract(filename)                 #解压文件

        print(filename)

输出解压后的信息:

_rels/

_rels/.rels

customXml/

customXml/_rels/

customXml/_rels/item1.xml.rels

customXml/_rels/item2.xml.rels

customXml/item1.xml

customXml/item2.xml

customXml/itemProps1.xml

customXml/itemProps2.xml

docProps/

docProps/app.xml

docProps/core.xml

docProps/custom.xml

docProps/thumbnail.wmf

word/

word/_rels/

word/_rels/document.xml.rels

word/document.xml

word/fontTable.xml

word/media/

word/media/image1.jpeg

word/numbering.xml

word/settings.xml

word/styles.xml

word/theme/

word/theme/theme1.xml

例子:获取word文档中的图片

‘‘‘

——获取图:

word文档的路径

zip压缩文件的路径

临时解压的tmp路径

最后需要保存的store_path路径

‘‘‘

def getpic(path, zip_path, tmp_path, store_path):

    ‘‘‘

    :param path:源文件

    :param zip_path:docx重命名为zip

    :param tmp_path:中转图片文件夹

    :param store_path:最后保存结果的文件夹(需要手动创建)

    :return:

    ‘‘‘

    ‘‘‘=============将docx文件重命名为zip文件====================‘‘‘

    os.rename(path, zip_path)

    # 进行解压

    f = zipfile.ZipFile(zip_path, ‘r‘)

    # 将图片提取并保存

    for file in f.namelist():

        f.extract(file, tmp_path)

    # 释放该zip文件

    f.close()

    ‘‘‘=============将docx文件从zip还原为docx====================‘‘‘

    os.rename(zip_path, path)

    # 得到缓存文件夹中图片列表

    pic = os.listdir(os.path.join(tmp_path, ‘word/media‘))

    ‘‘‘=============将图片复制到最终的文件夹中====================‘‘‘

    for i in pic:

        # 根据word的路径生成图片的名称

        new_name = path.replace(‘\\‘, ‘_‘)

        new_name = new_name.replace(‘:‘, ‘‘) + ‘_‘ + i

        shutil.copy(os.path.join(tmp_path + ‘/word/media‘, i), os.path.join(store_path, new_name))

    ‘‘‘====删除缓冲文件夹中的文件,用以存储下一次的文件====‘‘‘

    for i in os.listdir(tmp_path):

        # 如果是文件夹则删除

        if os.path.isdir(os.path.join(tmp_path, i)):

            shutil.rmtree(os.path.join(tmp_path, i))

if __name__ == ‘__main__‘:

    # 源文件

    path = r‘E:\dogcat\提取图片\log.docx‘

    # docx重命名为zip

    zip_path = r‘E:\dogcat\提取图片\log.zip‘

    # 中转图片文件夹

    tmp_path = r‘E:\dogcat\提取图片\tmp‘

    # 最后保存结果的文件夹

    store_path = r‘E:\dogcat\提取图片\测试‘

    m = getpic(path, zip_path, tmp_path, store_path)

例子:把doc转存为docx

def docTTTTTdocx(doc_name, docx_name):

    try:

        # 首先将doc转换成docx

        word = client.Dispatch(“Word.Application”)

        doc = word.Documents.Open(doc_name)

        # 使用参数16表示将doc转换成docx

        doc.SaveAs(docx_name, 16)

        doc.Close()

        word.Quit()

    except:

        pass

 

资源下载: