python 翻译word表格小程序

喜欢而已 提交于 2020-02-26 22:24:18

背景
原是弱电集成的设计员,纠结很久后参加了python培训机构转职后的一员小白,由于一次工作中需要翻译一份近100页word表格,纯手工翻译大概三个小时,为了解决这种重复又耗时的劳动,并重温python 相关知识所以制作了该小程序。

脚本详情

import re
import docx
import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.options import Options  # 导入chrome选项
from selenium.webdriver.common.keys import Keys
from os import system
'''
seleium爬虫效率很低但胜在不用考虑反爬问题,由于想加快翻译速度并实现转换为exe文件后可在其他无python环境中运行,
添加excel表格充当数据库,excel文件中,一列命名漏洞英文列表,一列命名漏洞翻译列表,由于使用seleeium需在python目
录下添加对应浏览器driver,由于我使用的是chrome所以需下载chromedriver。
'''
def mydoc(doc,table,huan,expath):
    table_contents = []
    table_content_trans = []
    for i in range(0,len(table.rows)):#设定i值极限 行
        data = pd.DataFrame(pd.read_excel(expath))
        datalist_d = data['漏洞英文列表']
        datalist_t = data['漏洞翻译列表']
        i_text = table.cell(i,0).text#表格内i行j列单元格内容赋值给i_text
        zhPattern = re.compile(u'[\u4e00-\u9fa5]+')  # 中文字符范围
        szPattern = re.compile(u'[0-9]') # 数字范围
        # spPattern = re.compile(u'[/]+')
        contents = u'{}'.format(i_text)  # 表格内单元格文本
        # search整个字符串内查找模式匹配,找到第一个匹配然后返回一个包含匹配信息的对象,无则NONE
        # match匹配字符串第一位,开头位置是否匹配,匹配成功才会返回结果,否则返回None
        #'[^?\\/]'返回指定标点符号
        match_zh = zhPattern.search(contents)
        match_sz = szPattern.match(contents)
        if match_zh or match_sz:
            pass

        else:
            if len(datalist_d) != 0:
                flag_excel = False
                for j in range(len(datalist_d)):
                    if datalist_d[j] == i_text:
                        table.cell(i,0).text = str(datalist_t[j])
                        flag_excel = True
                        break
                if flag_excel == False:
                    print('漏洞库中未搜索到...')
                    table_contents.append(i_text)  # 表格内内容
                    trans_result = myspider(i_text)  # 翻译表格内容
                    print('翻译中...')
                    if huan == 1:
                        trans_result_n = trans_result.replace("\n", "")  # 内容去除换行
                        table.cell(i, 0).text = trans_result_n  # 替换表格内容
                        table_content_trans.append(trans_result_n)  # 翻译和排版后内容加入表格
                        data_t = pd.Series({"漏洞英文列表": i_text,"漏洞翻译列表": trans_result_n}, name='漏洞库')  # 添加数据
                        data_add_t = data.append(data_t)  # 添加数据
                        data_add_t.to_excel(expath, index=False)  # 存入excel中
                        print('存入漏洞库...')
                    else:
                        table.cell(i, 0).text = trans_result  # 替换表格内容
                        table_content_trans.append(trans_result)  # 翻译和排版后内容加入表格
                        data_t = pd.Series({"漏洞英文列表": i_text,"漏洞翻译列表": trans_result}, name='漏洞库')  # 添加数据
                        data_add_t = data.append(data_t)  # 添加数据
                        data_add_t.to_excel(expath, index=False)  # 存入excel中
                        print('存入漏洞库...')

            else:
                print('漏洞库为空')
                table_contents.append(i_text)  # 表格内内容
                trans_result = myspider(i_text)  # 翻译表格内容
                print('翻译中...')
                if huan == 1:
                    trans_result_n = trans_result.replace("\n", "")  # 内容去除换行
                    table.cell(i, 0).text = trans_result_n  # 替换表格内容
                    table_content_trans.append(trans_result_n)  # 翻译和排版后内容加入表格
                    data_t = pd.Series({"漏洞英文列表": i_text,"漏洞翻译列表": trans_result_n}, name='漏洞库')  # 添加数据
                    data_add_t = data.append(data_t)  # 添加数据
                    data_add_t.to_excel(expath, index=False)  # 存入excel中
                    print('存入漏洞库...')
                else:
                    table.cell(i, 0).text = trans_result  # 替换表格内容
                    table_content_trans.append(trans_result)  # 翻译和排版后内容加入表格
                    data_t = pd.Series({"漏洞英文列表": i_text,"漏洞翻译列表": trans_result}, name='漏洞库')  # 添加数据
                    data_add_t = data.append(data_t)  # 添加数据
                    data_add_t.to_excel(expath, index=False)  # 存入excel中
                    print('存入漏洞库...')

    #判断列表中是否都是空字符串
    flag = False
    for i in table_contents:
        if i.strip() != '':
            flag = True
    # 空列表或者列表中都是空字符串不翻译
    if len(table_contents) == 0 or flag == False:
        return print("此表格无需翻译或漏洞库中已存储")
    else:
        print('表格待翻译内容:',table_contents)
        print('表格翻译后内容:',table_content_trans)

def myspider(text):
    # 设置chrome浏览器无头模式
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    driver = webdriver.Chrome(chrome_options=chrome_options)
    # driver.fullscreen_window()   #全屏
    driver.maximize_window()  # 屏幕最大化
    # 打开有道翻译页面
    driver.get("http://fanyi.youdao.com/")
    time.sleep(0.5)
    # 获取页面名为inputOriginal的id标签的文本内容
    inputwd = driver.find_element_by_id("inputOriginal")  # 搜索输入文本框的id属性值              .text #id="wrapper"的所有文本
    but = driver.find_element_by_id('transMachine')  # 搜索提交按钮//*[@id="transMachine"]
    outputwd = driver.find_element_by_xpath('//*[@id="transTarget"]')  # 翻译后文本框
    inputwd.clear()  # 清除文本框里的内容
    # outputwd.clear()  # 清除文本框里的内容
    inputwd.send_keys(text)  # 输入翻译内容
    but.send_keys(Keys.RETURN)  # 输入回车键  but.click()  #点击按钮s
    time.sleep(0.5)
    result = outputwd.text
    # 关闭浏览器
    driver.quit()
    return result

def mymain():
    # urlname = input('输入路径:')
    docname = input('输入文件全名:')
    huan = int(input('翻译内容是否需删除换行(1.是2.否):'))
    # urlname_t = urlname.replace('\\','\\\\')
    # print('转义后路径:',f'{urlname}//{docname}')
    path = f'.\\{docname}' #文件路径
    expath = '.\\漏洞库.xlsx'
    doc = docx.Document(path)
    tables = doc.tables  # 获取文件中的表格集
    e1 = time.time()
    print(f'共{len(tables)}个表格')
    n = 1
    try:
        for i in range(0,len(tables)):
            table = tables[i]
            mydoc(doc,table,huan,expath)
            print(f'\n剩余{len(tables)-n}个表格待翻译')
            time.sleep(0.3)
            n += 1
            doc.save(f".\\trans{docname}")
    except Exception as e:
        print('报错:',e)
    e2 = time.time()
    print('耗时:',float(e2 - e1))
    print('转换完毕')
    system('pause')

mymain()




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!