zoukankan      html  css  js  c++  java
  • 如何用Python将Word文档转换为Excel表格

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

    作者:小小明

    来源:菜J学Python

    Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

    https://space.bilibili.com/523606542

    需求

    有一个下面这种形式的word表格:

    如何用Python将Word文档转换为Excel表格

     

    希望能转换为下面这种格式的excel表格:

    如何用Python将Word文档转换为Excel表格

     

    测试word文档读取

    先测试一个word文档前1页的数据读取:

    from docx import Document
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    for i, paragraph in enumerate(doc.paragraphs[:55]):
        print(i, paragraph.text)
    如何用Python将Word文档转换为Excel表格

     

    从读取效果上看,各行文本数据都能很顺利的获取到。

    匹配题型、题目和具体的选项

    现在我们需要做的是就是匹配题型、题目和具体的选项,观察可以发现规律:

    1. 题型以大写数字开头
    2. 题目以普通数字+.开头
    3. 选项以括号+字母开头

    额外需要注意的:

    开头几行文本也存在普通数字+.开头的,需要直接排除。

    第7题的题目,和第19题的选项存在一些特殊的空白字符需要排除,

    括号和小数点都同时存在半角和全角两种情况。

    对于需要注意的第二点:

    如何用Python将Word文档转换为Excel表格

     

    查看一下这2处的空白字符:

    doc.paragraphs[21].text

    '7.(xa0xa0)是第一家实施六西格玛管理的公司。xa0'

    doc.paragraphs[49].text

    '(A)参数设计 (B)常量设计u3000 (C)变量设计u3000u3000 (D)系统设计'

    发现分别是xa0和u3000。

    整理好大致思路,我组织一下处理代码:

    import re
    from docx import Document
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    
    black_char = re.compile("[su3000xa0]+")
    
    chinese_nums_rule = re.compile("[一二三四]、(.+?)(")
    title_rule = re.compile("d+.")
    option_rule = re.compile("([ABCDEF])")
    option_rule_search = re.compile("([ABCDEF])[^(]+")
    
    
    # 从word文档的“一、单项选择题”开始遍历数据
    for paragraph in doc.paragraphs[5:25]:
        #  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间二个空格
        line = black_char.sub("", paragraph.text).replace(
            "(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")
        # 对于空白行就直接跳过
        ifnot line:
            continue
        if title_rule.match(line):
            print("题目", line)
        elif option_rule.match(line):
            print("选项", option_rule_search.findall(line))
        else:
            chinese_nums_match = chinese_nums_rule.match(line)
            if chinese_nums_match:
                print("题型", chinese_nums_match.group(1))
    如何用Python将Word文档转换为Excel表格

     

    从目前测试结果来看没有问题。

    保存匹配到的数据到结构化字典

    现在我打算将当前匹配出来的文本数据存储成字典形式的结构化数据,字典结构的设计如下:

    如何用Python将Word文档转换为Excel表格

     

    根据上述设计完善代码:

    import re
    from docx import Document
    from collections import OrderedDict
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    
    black_char = re.compile("[su3000xa0]+")
    
    chinese_nums_rule = re.compile("[一二三四]、(.+?)(")
    title_rule = re.compile("d+.")
    option_rule = re.compile("([ABCDEF])")
    option_rule_search = re.compile("([ABCDEF])[^(]+")
    
    # 保存最终的结构化数据
    question_type2data = OrderedDict()
    # 从word文档的“一、单项选择题”开始遍历数据
    for paragraph in doc.paragraphs[5:]:
        #  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间一个空格
        line = black_char.sub("", paragraph.text).replace(
            "(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")
        # 对于空白行就直接跳过
        ifnot line:
            continue
        if title_rule.match(line):
            options = title2options.setdefault(line, [])
        elif option_rule.match(line):
            options.extend(option_rule_search.findall(line))
        else:
            chinese_nums_match = chinese_nums_rule.match(line)
            if chinese_nums_match:
                question_type = chinese_nums_match.group(1)
                title2options = question_type2data.setdefault(question_type, OrderedDict())
    

    遍历结构化字典并存储

    然后我们遍历结构化字典,将数据保存到pandas对象中:

    import pandas as pd
    
    result = []
    max_options_len = 0
    for question_type, title2options in question_type2data.items():
        for title, options in title2options.items():
            result.append([question_type, title, *options])
            options_len = len(options)
            if options_len > max_options_len:
                max_options_len = options_len
    df = pd.DataFrame(result, columns=[
                      "题型", "题目"]+[f"选项{i}"for i in range(1, max_options_len+1)])
    # 题型可以简化下,去掉选择两个字
    df['题型'] = df['题型'].str.replace("选择", "")
    df.head()
    

    结果:

    如何用Python将Word文档转换为Excel表格

     

    最终保存结果:

    df.to_excel("result.xlsx", index=False)

    完整代码

    最终完整代码:

    import pandas as pd
    import re
    from docx import Document
    from collections import OrderedDict
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    
    black_char = re.compile("[su3000xa0]+")
    
    chinese_nums_rule = re.compile("[一二三四]、(.+?)(")
    title_rule = re.compile("d+.")
    option_rule = re.compile("([ABCDEF])")
    option_rule_search = re.compile("([ABCDEF])[^(]+")
    
    # 保存最终的结构化数据
    question_type2data = OrderedDict()
    # 从word文档的“一、单项选择题”开始遍历数据
    for paragraph in doc.paragraphs[5:]:
        #  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间一个空格
        line = black_char.sub("", paragraph.text).replace(
            "(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")
        # 对于空白行就直接跳过
        ifnot line:
            continue
        if title_rule.match(line):
            options = title2options.setdefault(line, [])
        elif option_rule.match(line):
            options.extend(option_rule_search.findall(line))
        else:
            chinese_nums_match = chinese_nums_rule.match(line)
            if chinese_nums_match:
                question_type = chinese_nums_match.group(1)
                title2options = question_type2data.setdefault(
                    question_type, OrderedDict())
    
    result = []
    max_options_len = 0
    for question_type, title2options in question_type2data.items():
        for title, options in title2options.items():
            result.append([question_type, title, *options])
            options_len = len(options)
            if options_len > max_options_len:
                max_options_len = options_len
    df = pd.DataFrame(result, columns=[
                      "题型", "题目"]+[f"选项{i}"for i in range(1, max_options_len+1)])
    # 题型可以简化下,去掉选择两个字
    df['题型'] = df['题型'].str.replace("选择", "")
    df.to_excel("result.xlsx", index=False)
    

    最终得到的文件:

    如何用Python将Word文档转换为Excel表格
  • 相关阅读:
    【原】ios打包ipa的四种实用方法(.app转.ipa)
    【原】Mac下统计任意文件夹中代码行数的工具——cloc
    【原+转】用CMake代替makefile进行跨平台交叉编译
    【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
    【原】Github系列之一:一起做仿天气类应用中的实时模糊效果LiveBlur
    【原】iOS:一种直接修改frame的某个属性的方法
    【原】iOS优秀开源项目总结
    【原】你真的懂iOS的autorelease吗?
    【原】iOS容易造成循环引用的三种场景,就在你我身边!
    Failure [DELETE_FAILED_INTERNAL_ERROR]之后rm apk卸载
  • 原文地址:https://www.cnblogs.com/hhh188764/p/14282973.html
Copyright © 2011-2022 走看看