zoukankan      html  css  js  c++  java
  • 【Python】自动化:读取word提取json并重新排版(已升级支持打印)

    原文章:复制and粘贴?Python脚本1分钟解决了我1小时的事!

    https://mp.weixin.qq.com/s/NeawdsRjws9vzsYfwvUIjg

    需求:将word格式json内容的问题和答案整理成整段,人类可读模式

    看到上面的内容,手工操作是不是很麻烦。

    别忘了有Python啥都不是事。下面是原作者的代码

    from docx import Document
    import re
    import pandas as pd
    import json 
    # 1.读取word文档,获取word文档里面的内容
    x = ""
    doc = Document(r"G:1Pycharm_Project3572(1).docx")
    for paragraph in doc.paragraphs:
        text = paragraph.text
        # 读取word里面的内容有一个特点:每一页会返回一个字符串,共3页,一共返回了3个单独的字符串。
        # 但是这是一个完整的json字符串,我们不能将他分开呀。因此,使用字符串拼接,将其合并起来。
        x += text
        
    # 2.使用json.loads()将json字符串 转换为 字典格式的数据。
    r = json.loads(x)
    
    # 3.对于字典,我们可以利用键,获取里面的值。
    x = []
    z = []
    for i in r["data"]["ques"]:
        x.append(i["content"])
        y ""
        for j in i["options"]:
            y += j["answer"] + " " + j["option"]
            y += ""
        z.append(y)
        
    # 4.将获取到的数据,保存成一个DataFrame格式的数据,并导出为excel表格。
    data = {"content":x,"options":z}
    df = pd.DataFrame(data)
    display(df)
    df.to_excel("text.xlsx")

    效果如下

     感谢群主提供原文件和思路,升级优化才得以实现。

    前面和原创一致,后面数据整理略微差异。

    安装库文件

    # 关于from docx import Document报错问题,docx库比较老,安装python-docx就可以解决问题。
    !pip install  python-docx

    解析文本

    from docx import Document
    import re
    import pandas as pd
    import json 
    # 1.读取word文档,获取word文档里面的内容
    x = ""
    doc = Document("jsonfile.docx")
    for paragraph in doc.paragraphs:
        text = paragraph.text
        # 读取word里面的内容有一个特点:每一页会返回一个字符串,共3页,一共返回了3个单独的字符串。
        # 但是这是一个完整的json字符串,我们不能将他分开呀。因此,使用字符串拼接,将其合并起来。
        x += text
        
    # 2.使用json.loads()将json字符串 转换为 字典格式的数据。
    r = json.loads(x)
    r

    输出内容

     解析处理,调整格式

    # 3.对于字典,利用键获取里面的值。
    queslst=[]
    optlst=[]
    n=1
    for i in r['data']['ques']:
        question=str(n)+''+i['content'].rstrip()
        n+=1
        ops=[]
        for option in i['options']:
            j = option["option"]+""+ option["answer"].rstrip()
            ops.append(j)
        ops='	'.join(ops)   
        queslst.append(question)
        optlst.append(ops)

    写入excel

    # 4.将获取到的数据,保存成一个DataFrame格式的数据,并导出为excel表格。
    data = {"question":queslst,"options":optlst}
    df = pd.DataFrame(data)
    display(df)
    df.to_excel("output2.xlsx",index=None)

    输出格式

    excel内容

    新增点,存为word格式,需要重新排版

    效果预览

    # 5、写入docx
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.oxml.ns import qn
    
    from time import strftime, localtime
    timestr=strftime('%Y-%m-%d %H:%M:%S',localtime())
    
    doc1 = Document()  #生成一个空的docx对象
    head=doc1.add_heading('安全测试题', level=1) # 添加标题
    head.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中
    p1=doc1.add_paragraph('edit by:HuaBro 	 update time: {}'.format(timestr))   # 添加段落
    p1.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中
    
    
    for i,j in zip(queslst,optlst):
        doc1.add_paragraph(i)
        doc1.add_paragraph(j)
    doc1.styles['Normal'].font.name = '宋体'
    doc1.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') # 字体
    doc1.styles['Normal'].font.name = 'Times New Roman' # 数字字体
    doc1.save('output1.docx')  

    输出word内容

    学会了没,是不是很简单。

  • 相关阅读:
    关于Python虚拟环境与包管理你应该知道的事
    你是否真的了解全局解析锁(GIL)
    谈谈装饰器的实现原理
    快速了解Python并发编程的工程实现(下)
    快速了解Python并发编程的工程实现(上)
    简单了解一下事件循环(Event Loop)
    为何你还不懂得如何使用Python协程
    一文搞懂Python可迭代、迭代器和生成器的概念
    源码分析Retrofit请求流程
    一份程序猿单词列表(updating)
  • 原文地址:https://www.cnblogs.com/hightech/p/13092675.html
Copyright © 2011-2022 走看看