python读取word文档识别字段颜色,解析字段

python版本3.7.3,读取的文档格式为.docx

文中带有简单注释

看不懂的百度网盘下载直接查看,更改运行里面的py文件

import os
import sys
import xlrd
import codecs
import collections
import json
import io
import docx
import string
from docx import Document
from docx.shared import RGBColor #这个是docx的颜色类 

maxLength = 0
id = 1
convert_list = []
type_list = []
curPath = os.path.dirname(os.path.abspath(__file__))
# coding=utf-8
#获取文档对象
def readDocx(fileName,type):
    xlsFile = curPath + '\\'+fileName+'.docx'   #地理(葡)Respueda G .es.pt
    print("xlsFile: "+xlsFile)
    file=docx.Document(xlsFile)
    # print("段落数:"+str(len(file.paragraphs)))

    index = 0
    data = {}
    i = 0
    global id
    global maxLength
    for p in file.paragraphs:
        i = i + 1
        if i <= 1:  #跳过第一行
            continue
        if p.text == "" or (not p.text.strip()):
            continue
        # print("读取第 "+str(i)+" 行,文件名:"+fileName+" ID:"+str(id)+"  内容:"+p.text)
        if index == 0: #提取题目
            # print(p.text.find("-"),"题的内容是:", p.text)
            length = len(p.text)
            idx = p.text.find("Número")
            if idx != -1 and idx < 2:
                idx = idx + len("Número") + 1
                # print("Número: "+str(idx)+"   text: "+p.text)
                p.text = p.text[idx:(length)]
                # print("Número: "+str(idx)+"   text: "+p.text)
            
            indexStr = "-" #分隔符
            if p.text.find(indexStr) == -1:
                indexStr = "."
                if p.text.find(indexStr) == -1:
                    indexStr = " "
            # print("题的内容是:", p.text)
            idx = p.text.index(indexStr)+len(indexStr)
            length = len(p.text)
            if length > maxLength:
                maxLength = length
                # print(id,"最大字符数",maxLength)
            # print(str(idx)+str(length)+"第"+str(id)+"题的内容是:"+p.text)
            questionAndsubType = p.text[idx:(length)]
            questionAndsubTypeList = questionAndsubType.split("|")

            data["question"] = questionAndsubTypeList[0] #题目
            
            # if len(questionAndsubTypeList) > 1 : #类型
                # subType = questionAndsubTypeList[1].replace("\n", "")
                # print("---类型---",type_list.count(subType))
                # if type_list.count(subType) <= 0 :
                    # type_list.append(subType)

            data["subType"] = type#escape(subType)  #类型
        else:   #提取选项,以及正确答案
            # print("第"+str(id)+"题    选项"+ str(index) +"是:"+p.text)
            length = len(p.text)
            for n in p.runs:
                rgb = str(n.font.color.rgb) #读取段落颜色
                # print("runs"+rgb)
                if rgb == "00FF00":
                    # print("正确答案: ",index)
                    data["rightIndex"] = index
            #删除段落中不必要文字
            idx = p.text.find("(Direito)")
            if idx != -1:
                p.text = p.text[0:idx]
                
            idx = p.text.find("(Correcta)")
            if idx != -1:
                p.text = p.text[0:idx]
                
            idx = p.text.find("(Right)")
            if idx != -1:
                p.text = p.text[0:idx]
                
            idx = p.text.find("(Correct)")
            if idx != -1:
                p.text = p.text[0:idx]
            #删除段落中不必要文字
            
            data["option"+str(index)] = p.text

        index = index + 1

        if index >= 5:
            data["_id"] = id
            # print("data: "+str(data))
            convert_list.append(data)
            index = 0
            id = id + 1
            data = {}

def writeDocx(fileList,name):
    global id
    global convert_list
    global type_list
    id = 1
    convert_list = []
    type_list = []
    
    for p in fileList:
        readDocx(p["path"],p["type"])
    #题库
    jsonPath = os.path.join(curPath,"topic",name+".txt") #写入路径
    dirname = os.path.dirname(jsonPath)
    if not os.path.exists(dirname):
        os.makedirs(dirname)

    with io.open(jsonPath, 'w', encoding='utf-8') as f:     #按照对应路径写入
        f.write(json.dumps(convert_list, ensure_ascii=False, indent=4, sort_keys=True))

def main():
    en_fileList =  [{"path":"en_us_topic\\地理(英)Respueda G .es.en",          "type":"World"},
                    {"path":"en_us_topic\\科学与技术(英)",                    "type":"Technology"},
                    {"path":"en_us_topic\\历史(英)Resupeda H.es.en",           "type":"History"},
                    {"path":"en_us_topic\\艺术和文学(英)Respueda A&L.es.en",  "type":"ArtAndLiterature"},
                    {"path":"en_us_topic\\娱乐(英)Respueda E.es.en",           "type":"Fashion"},
                    {"path":"en_us_topic\\运动(英)Respueda  D.es.en",          "type":"Sports"}]
    en_name = "en_us_topic"

    es_fileList =  [{"path":"es_es_topic\\地理(西)Respueda G ",                "type":"World"},
                    {"path":"es_es_topic\\科学与技术(西)Respueda C&T",            "type":"Technology"},
                    {"path":"es_es_topic\\历史(西)Resupeda H",                 "type":"History"},
                    {"path":"es_es_topic\\艺术和文学(西)Respueda A&L",        "type":"ArtAndLiterature"},
                    {"path":"es_es_topic\\娱乐(西)Respueda E",                 "type":"Fashion"},
                    {"path":"es_es_topic\\运动(西)Respueda  D",                "type":"Sports"}]
    es_name = "es_es_topic"

    pt_fileList =  [{"path":"pt_br_topic\\地理(葡)Respueda G .es.pt",          "type":"World"},
                    {"path":"pt_br_topic\\科学与技术(葡)",                    "type":"Technology"},
                    {"path":"pt_br_topic\\历史(葡)Resupeda H.es.pt",           "type":"History"},
                    {"path":"pt_br_topic\\艺术和文学(葡)Respueda A&L.es.pt",  "type":"ArtAndLiterature"},
                    {"path":"pt_br_topic\\娱乐(葡)Respueda E.es.pt",           "type":"Fashion"},
                    {"path":"pt_br_topic\\运动(葡)Respueda  D.es.pt",          "type":"Sports"}]
    pt_name = "pt_br_topic"

    writeDocx(pt_fileList,pt_name)
    writeDocx(es_fileList,es_name)
    writeDocx(en_fileList,en_name)
    
main()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容