一、開始之前的準(zhǔn)備工作:
環(huán)境:操作系統(tǒng)win10,python2.7.15,開發(fā)軟件為pycharm社區(qū)版
問題1:如何在pycharm中切換python版本。
原因:現(xiàn)在有些模塊支持的Python版本不一樣,所以在開發(fā)時(shí)經(jīng)常需要切換版本來開發(fā)。
1、點(diǎn)擊file->setting

2、切換需要的環(huán)境

注意:選擇環(huán)境前必須安裝了對應(yīng)的python版本,并且添加到環(huán)境變量中。

問題2:如何給不同版本的python導(dǎo)入對應(yīng)的模塊。
導(dǎo)入模塊一般兩種方式:
1、使用pycharm來導(dǎo)入(推薦)


2、使用cmd的pip install xxx 命令方式。
二、開始doc或者docx的替換操作
需求:我需要把文件夾下的所有docx文件即一整套模板,中的某些字符進(jìn)行替換,然后生成填完后的文件。
參考之前寫的:http://www.itdecent.cn/p/95bbb29ce3a9
1、創(chuàng)建py文件的時(shí)候注意,2.7.15版本默認(rèn)編碼格式不是utf-8,而我們一般操作字符都是以utf-8的方式,故需要添加一些代碼把編碼格式轉(zhuǎn)為utf-8。python3之后默認(rèn)格式都是utf-8了。
在文件開頭添加如下代碼:
#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
2、操作docx文件需要導(dǎo)入的模塊
2.1、python-docx (操作docx文件)
看模塊名就知道該模塊只能處理docx不能處理doc
2.2、pywin32 (方便Python調(diào)用windows的API)
from docx import Document
from docx.shared import Pt #磅數(shù)
from docx.oxml.ns import qn #chinese
import os
from win32com import client as wc #導(dǎo)入doc轉(zhuǎn)docx
3、開始編寫腳本
#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from docx import Document
from docx.shared import Pt #磅數(shù)
from docx.oxml.ns import qn #chinese
import os
from win32com import client as wc #導(dǎo)入doc轉(zhuǎn)docx
#找到文件夾下的所有doxc文件并獲得文件名
def file_name(file_dir):
for root,dirs,files in os.walk(file_dir):
return files
#遍歷剛才找到的所有文件夾然后替換關(guān)鍵字
def change_text(old_text, new_text,document):
all_paragraphs = document.paragraphs
for paragraph in all_paragraphs:
for run in paragraph.runs:
if old_text in run.text:
run.text = run.text.replace(old_text, new_text)
all_tables = document.tables
for table in all_tables:
for row in table.rows:
for cell in row.cells:
for paragraph in cell.paragraphs:
for run in paragraph.runs:
if old_text in run.text:
run.text = run.text.replace(old_text, new_text)
#把doc文件轉(zhuǎn)為docx文件
def doc_to_docx(file1,file2):
word = wc.Dispatch("Word.Application") # 打開word應(yīng)用程序
doc = word.Documents.Open(file1) #打開word文件
doc.SaveAs("{}x".format(file2), 12) #另存為后綴為".docx"的文件,其中參數(shù)12指docx文件
doc.Close() #關(guān)閉原來word文件
word.Quit()
return "{}x".format(file) #返回的是一個(gè)file對象或者文件名稱
#把docx文件轉(zhuǎn)為doc文件
def docx_to_doc(file1,file2):
word = wc.Dispatch("Word.Application") # 打開word應(yīng)用程序
doc = word.Documents.Open(file1) #打開word文件
doc.SaveAs("{}".format(file2[:-1]), 0) #另存為后綴為".docx"的文件,其中參數(shù)12指docx文件
doc.Close() #關(guān)閉原來word文件
word.Quit()
return "{}x".format(file) #返回的是一個(gè)file對象或者文件名稱
#進(jìn)行批量替換并生成新文件
#第一個(gè)參數(shù)傳入模板文件夾路徑,第二個(gè)參數(shù)導(dǎo)出結(jié)果到某個(gè)文件夾路徑(請寫絕對路徑)
def deal_task(importPath,exportPath):
words = file_name(importPath) #獲取所有文件的文件名
for words_name in words:
print words_name #打印獲取的文件名查看是否有錯(cuò)誤
#只有后綴為docx的文件可以繼續(xù)執(zhí)行
if words_name.find('.docx') != -1:
#PackageNotFoundError,捕獲一下該異常
try:
document = Document(importPath+'/'+words_name) #讀取當(dāng)前遍歷的文件
document.styles['Normal'].font.name = u"仿宋_GB2312"
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u"仿宋_GB2312")
document.styles['Normal'].font.size = Pt(12)
#進(jìn)行替換操作
#old_text和new_text都是動態(tài)傳入
#遍歷entry_list和entry_str來執(zhí)行動態(tài)操作,偶是old奇數(shù)是new
for num in range(0,len(entry_list)-1,2):
#輸入框任一一欄沒有輸入內(nèi)容不會執(zhí)行替換操作
if entry_list[num] != '' and entry_list[num+1] != '':
change_text(entry_list[num].strip(),entry_list[num+1].strip(),document)
print 'old_text: ' + entry_list[num]
print 'new_next: ' + entry_list[num+1]
document.save(exportPath+"/"+"auto"+words_name) #默認(rèn)存儲為auto+原文件名的方式
except Exception as e:
print '打開docx文件失敗'
print e
print "完成!"
#進(jìn)行批量轉(zhuǎn)換并生成轉(zhuǎn)換后的文件到文件夾內(nèi)
#第一個(gè)參數(shù)導(dǎo)入的路徑,第二個(gè)是導(dǎo)出的路徑
def docTodocx(importPath,exportPath):
fileNames = file_name(importPath) # 獲得所有文件名
# filePath = importPath
for fileName in fileNames: # 遍歷文件夾下的所有文件
# 先判斷是否有doc然后再判斷docx,只要不是doc直接跳過
# fileName = fileName.decode('gb2312').encode('utf-8')
if fileName.find('doc') != -1:
print '進(jìn)入doc處理循環(huán)'
file1 = importPath + "/" + fileName
print 'file1:' + file1
file1 = file1.decode('utf-8').encode('gb2312')
# print 'gb2312編碼的file1: ' + file1
file2 = exportPath + "/" + fileName
print 'file2:' + file2
file2 = file2.decode('utf-8').encode('gb2312')
doc_to_docx(file1, file2)
#設(shè)定自己要替換的數(shù)組第一個(gè)是old_text,第二個(gè)是new_text依次次類推
entry_list = ["X1","2021","X2","2022"]
if __name__ == "__main__":
#如果模板全是docx只需要調(diào)用deal_task()函數(shù)就行了,不是的話先調(diào)用docTodocx轉(zhuǎn)為docx
#第一步把doc轉(zhuǎn)為docx
docTodocx("I:/pythonProject1/docx_operation/importPath","I:/pythonProject1/docx_operation/temporary")
deal_task("I:/pythonProject1/docx_operation/temporary","I:/pythonProject1/docx_operation/exportPath")
注意:這里docTodocx()和docxTodoc()就是對應(yīng)doc文件轉(zhuǎn)docx和docx轉(zhuǎn)doc。程序這里只使用docTodocx()函數(shù)。
4、使用方式
新建三個(gè)文件夾
1exportPath(存放結(jié)果)
2importPath(存放模板)
3temporary(存放臨時(shí)模板如經(jīng)過轉(zhuǎn)換得到的docx)

然后開始執(zhí)行腳本,即可實(shí)現(xiàn)批量替換模板中的文字。如我這里只用兩個(gè)文件作為演示
展示操作步驟:
1、準(zhǔn)備將1.docx和2.docx文件內(nèi)的X1和X2分別替換成2021和2022


2、打開腳本進(jìn)行操作
#設(shè)定自己要替換的數(shù)組第一個(gè)是old_text,第二個(gè)是new_text依次次類推
entry_list = ["X1","2021","X2","2022"]
if __name__ == "__main__":
#如果模板全是docx只需要調(diào)用deal_task()函數(shù)就行了,不是的話先調(diào)用docTodocx轉(zhuǎn)為docx
#第一步把doc轉(zhuǎn)為docx
docTodocx("I:/pythonProject1/docx_operation/importPath","I:/pythonProject1/docx_operation/temporary")
deal_task("I:/pythonProject1/docx_operation/temporary","I:/pythonProject1/docx_operation/exportPath")
注意:把絕對路徑中的反斜杠改成斜桿/
3、控制臺會顯示要替換的內(nèi)容和替換的內(nèi)容

4、查看文件是否生成且替換成功



使用的注意事項(xiàng):
1、復(fù)制代碼然后安按照規(guī)則填入路徑在win10,python2.7.15下可正常運(yùn)行,寫之前自己測試過沒問題。
2、要替換的字符串必須只能是數(shù)字加字母之前文章中也提過。
3、替換的時(shí)候必須關(guān)閉WPS或者word軟件,因?yàn)槌绦蜻\(yùn)行時(shí)候需要打開對應(yīng)的軟件進(jìn)行操作。
4、文件名或者路徑有中文的時(shí)候控臺會亂碼,程序是可以正常執(zhí)行的。原因是windows中的中文一般編碼都是gbk或者gb2312,控制臺只能顯示utf-8。
注:轉(zhuǎn)載請注明出處
本文如果對你有幫助的話希望能給我點(diǎn)個(gè)贊哦~