自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用 Python 寫的文檔批量翻譯工具,效果竟然超越付費(fèi)軟件?

開發(fā) 后端
本文將給大家分享一個(gè)實(shí)用的Python辦公自動(dòng)化腳本 「利用Python批量翻譯英文Word文檔并保留格式」,最終效果甚至比部分收費(fèi)的軟件還要好!先來看看具體的工作內(nèi)容。

 一、需求描述

[[399543]]

手上有大量外文文檔(本案例以5份為例,分別命名為 test1.docx test2.docx 以此類推),其中一份如下:

基本需求:「批量將這些文檔的內(nèi)容全部翻譯成中文,并轉(zhuǎn)存到新的文件中」,效果如下:

高級(jí)需求:基本需求滿足的同時(shí),要求 「保留原文檔的格式」,效果如下:

二、邏輯梳理

1. 翻譯 API

本需求的核心是翻譯,策略是利用網(wǎng)絡(luò)的翻譯 API,這里推薦百度翻譯開放平臺(tái),不考慮并發(fā)數(shù)的話可以用標(biāo)準(zhǔn)版,免費(fèi)使用不限字符量!

百度翻譯開放平臺(tái):http://api.fanyi.baidu.com/api/trans/product/index

在使用百度的通用翻譯 API 之前需要完成以下工作:

  1. 使用百度賬號(hào)登錄百度翻譯開放平臺(tái)(http://api.fanyi.baidu.com);
  2. 注冊(cè)成為開發(fā)者,獲得APPID;
  3. 進(jìn)行開發(fā)者認(rèn)證(如僅需標(biāo)準(zhǔn)版可跳過);
  4. 開通通用翻譯API服務(wù):開通鏈接
  5. 參考技術(shù)文檔和Demo編寫代碼 

 

完成后在個(gè)人頁面在即可看到 ID 和密鑰,這個(gè)很重要!下面給出整理好的通用翻譯 API 的 demo,已經(jīng)對(duì)輸出做簡(jiǎn)單修改,代碼拿走就能用!

可以看到,測(cè)試內(nèi)容準(zhǔn)確的被翻譯出來,注意如果需要多次訪問 API,免費(fèi)版有并發(fā)數(shù)和時(shí)間限制,可以用 time 模塊睡眠一秒。

2. 格式修改

高級(jí)需求的難點(diǎn)就是保留格式,簡(jiǎn)單來說原文檔的頁面格式和段落格式是什么,翻譯后對(duì)應(yīng)的部分就是什么。

基于上述的邏輯關(guān)系,只需要獲取原文檔的對(duì)應(yīng)內(nèi)容再賦值給新翻譯的文檔即可。(暫時(shí)只能滿足頁面設(shè)置和段落設(shè)置的統(tǒng)一,針對(duì)一段中特定詞語的格式修改,保證精確性需要基于自然語言處理NLP,本文暫不涉及)

2.1 頁面樣式

頁面樣式只要包括邊距、方向、高度、寬度等等,從原文檔中可以看到,采取的是窄邊距。但我們無需知道窄邊距四個(gè)方向應(yīng)該如何設(shè)置,只需要在代碼中呈現(xiàn)新舊文檔的變量傳遞即可,具體如下: 

 

2.2 段落樣式

段落樣式包括對(duì)齊、縮進(jìn)、間距等等,原文檔中采取了段后縮進(jìn),標(biāo)題是居中對(duì)齊。這些設(shè)置在變量傳遞中能夠很好完成。如果原文檔中沒有設(shè)置的變量值為 None。 

 

2.3 文字塊樣式修改

對(duì)于字號(hào)、加粗、斜體、顏色等樣式調(diào)整,采取的策略是建立空列表,遍歷原文檔每一段每一個(gè)文字塊,獲取相應(yīng)屬性并放到各自的列表中,對(duì)同一段而言,其包含的文字塊屬性最多的選項(xiàng)賦值給翻譯后文檔的對(duì)應(yīng)段落(如同一段全部或大部分的文字是加粗,則翻譯后對(duì)應(yīng)段落所有文字塊均設(shè)置為加粗) 對(duì)NLP感興趣的讀者可自行嘗試如何高度還原英文文檔中某些特定詞語的樣式修改,并在翻譯后的文檔中體現(xiàn)出來。 

 

上面的代碼不包含對(duì)字體的設(shè)置,因?yàn)闆]必要把英文的字體傳遞給中文文檔。對(duì)中文字體的設(shè)置之前的文章有提到過,比較復(fù)雜,直接見代碼: 

  1. from docx.oxml.ns import qn 
  2.  
  3. run.font.name = '微軟雅黑' 
  4. r = run._element.rPr.rFonts 
  5. r.set(qn('w:eastAsia'), '微軟雅黑'

3. 整體實(shí)現(xiàn)步驟

現(xiàn)在每個(gè)部分操作均以完成,考慮到本例中有多個(gè)文檔均需要翻譯,故全部邏輯如下:

  1. 利用 glob 模塊批處理框架可獲取某個(gè)文件的絕對(duì)路徑
  2. 由 python-docx 完成 Word 文件實(shí)例化后對(duì)段落進(jìn)行解析
  3. 解析出的段落文本交給百度通用翻譯 API,解析返回的 Json 格式結(jié)果(上面的修改 demo 中已經(jīng)完成了這一步)并重新寫入新的文件
  4. 同個(gè)文件全部解析、翻譯并寫入新文件后保存文件

三、代碼實(shí)現(xiàn)

導(dǎo)入需要的模塊,除翻譯 demo 中需要的庫外還需要 glob 庫批量獲取文件、python-docx 讀取文件、time 模塊控制訪問并發(fā)。為什么要 os 模塊見下文: 

  1. import requests 
  2. import random 
  3. import json 
  4. from hashlib import md5 
  5. import time 
  6. from docx import Document 
  7. import glob 
  8. import os 

對(duì)原 demo 的部分內(nèi)容進(jìn)行保留,涉及到 query 參數(shù)的代碼需要移動(dòng)到后面的循環(huán)中。保留的部分: 

 

效果如下: 

 

獲取到段落文本后,可以將段落文本賦值給 query 參數(shù),調(diào)用 API demo 的后續(xù)代碼。輸出結(jié)果的同時(shí)用 add_paragraph 將結(jié)果寫入新文檔: 

 

最后保存成新文件,期望命名為 原文件名_translated 的形式,可用 os.path.basename 方法獲取并經(jīng)字符串拼接達(dá)到目的: 

  1. wordfile_new.save(path + r'\\' + os.path.basename(file)[:-5] + '_translated.docx') 

 

單個(gè)文件操作完成后將讀取和創(chuàng)建文件的代碼塊放到批處理框架內(nèi): 

 

完成了上面的內(nèi)容后,基本需求就完成了。根據(jù)我們梳理的對(duì)樣式的修改知識(shí),再把樣式調(diào)整的代碼加進(jìn)來就行了,最終完整代碼如下: 

 

代碼運(yùn)行完畢后得到五個(gè)新的翻譯后文件:  

 

翻譯效果如下,可以看到英文被翻譯成中文,并且樣式大部分保留! 

 

至此,所有文檔都被成功翻譯,當(dāng)然這是機(jī)器翻譯的,具體應(yīng)用時(shí)還需要對(duì)關(guān)鍵部分進(jìn)一步人工調(diào)整,不過整體來說還是一次成功的Python辦公自動(dòng)化嘗試!

 

責(zé)任編輯:華軒 來源: 早起Python
相關(guān)推薦

2022-07-27 10:39:27

Python打包工具

2020-07-20 10:00:52

Python翻譯工具命令行

2020-04-03 10:57:09

文檔分支項(xiàng)目

2018-10-31 10:11:24

Python編程語言語音播放

2024-11-04 08:47:00

2010-03-19 16:52:16

Python代碼

2021-08-04 11:55:45

Python天氣查詢PySide2

2013-09-09 17:23:29

iOS應(yīng)用內(nèi)置付費(fèi)IAP

2018-01-29 20:12:11

python翻譯命令行

2020-04-14 13:10:36

天網(wǎng)終結(jié)者代碼

2013-03-25 10:23:24

路徑掃描web路徑掃描工具掃描

2011-05-25 17:17:54

前端開發(fā)

2020-09-16 06:09:43

開源工具PulpLinux

2012-08-15 14:11:21

2021-04-16 07:31:50

工具Postman接口

2020-08-28 13:20:53

谷歌Android開發(fā)者

2019-11-29 20:31:08

SphinxPython編程語言

2023-01-13 14:34:00

AI神經(jīng)網(wǎng)絡(luò)

2015-07-02 16:10:11

UIStackViewiOS 9

2022-03-11 08:24:38

表單驗(yàn)證源碼學(xué)習(xí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)