最近公司有个项目改名了,所以以前的文档也要全部修改。
大部分文档都需要改个名字,而大部分文档要修改的内容也是将文档的名字替换,此外就没了其他要修改的内容。
这样的情况下去一个一个操作文件时很费时间的,而且很容易出错。
恰好我现在正在学习python,而这些工作正是所python擅长的。所以我用python写了一个脚本文件解决了这些很繁杂的工作。
根据文档需要修改的文档的情况,有以下几件事是需要处理的:
- 列出当前文件夹下的所有文件;
- 将文件夹下所有文件的名字修改;
- 将所有doc文件里面的旧的项目名称替换为新的项目名字
根据上面的需求,脚本代码使用了一下的库:
- os:列举文件夹下的文件名称
- win32com:将doc格式的文件另存为docx格式的文件
- docx:修改docx里面的内容
- time:延时
下面我对各部分代码进行了解释。
1、引入要使用的库,定义了path和docx这两个变量
path是当前要操作的文件所在的文件夹,docx将doc格式文件另存为docx文件的保存目录
from docx import Document
import os
from win32com import client as wc
from time import sleep
path = 'D:/work'
docx = 'D:/docx'
2、定义了类Mydocx
class Mydocx:
"""批量处理docx文件"""
def __init__(self, old_info, new_info) -> None:
"""定义文件路径等"""
self.old_info = old_info #docx文件里面要替换掉的内容
self.new_info = new_info #docx文件里面新的内容
self.path = str(path) #替换文件所在的目录
3、使用os列出目录下的所有文件
因为python无法读取doc文件,而目录下的文件全是doc格式的,所以需要先将所有的文件另存为docx的文件在进行操作。为Mydocx这个类定义了一个方法get_files,用于列举目录下的所有的doc文件。这个方法用到了os模块的 listdir , listdir能列举目录下的所有文件的文件名。
def get_files(self):
"""从文件夹路径获取文件列表"""
files = []
# 从文件夹路径获取文件列表,并剔除非doc格式的文件
for file in os.listdir(self.path):
if file.endswith('.doc'):
files.append(file)
else:
print(file)
# self.doc2docx(files)
4、win32com用来将doc格式的文件另存为docx格式的文件
使用win32com将所有的文件全部另存为docx格式文件,并保存的另一个目录docx(D:/docx) 下。
def doc2docx(self, files):
"""doc转换docx"""
循环保存文件为docx格式
for file_name in files:
word = wc.Dispatch('Word.Application')
#目标名称
docx_name = file_name.split('.')[0]+'.docx'
path = u'%s/' % self.path + file_name
docx_path = u'%s/' % docx + docx_name
#存在同名的文件则跳出本次循环
if os.path.exists(docx_path):
print('exists')
continue
doc = word.Documents.Open(path)
# 目标路径下的文件
doc.SaveAs(docx_path, 12)
doc.Close()
word.Quit()
sleep(2)
5、循环读取文件并修改里面的内容
读取目标文件替换里面的内容。
def read(self, files):
"""读取所有文件"""
for file in files:
doc = Document(self.path+'/'+file)
self.update(doc)
doc.save(self.path+'/'+file)
print("%s替换完成" % file)
def update(self, doc):
"""替换文件内容"""
# 读取所有段落里面的内容并替换
for p in doc.paragraphs:
for run in p.runs:
run.text = run.text.replace(self.old_info, self.new_info)
# 读取所有表格里面的内容并替换
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
cell.text = cell.text.replace(
self.old_info, self.new_info) # 替换信息
6、修改文件名
def rename(self, files):
"""批量修改文件名"""
for file_name in files:
oldname = '%s/' % self.path + file_name
//去除文件里面的空格
# newname = '%s/' % self.path + \
# file_name.replace(' ', '')
newname = '%s/' % self.path + \
file_name.replace(self.old_info, self.new_info)
os.rename(oldname, newname) # 用os模块中的rename方法对文件改名
下面是完整的代码:
from docx import Document
import os
from win32com import client as wc
from time import sleep
path = 'D:/work'
docx = 'D:/docx'
class Mydocx:
"""批量处理docx文件"""
def __init__(self, old_info, new_info) -> None:
"""定义文件路径等"""
self.old_info = old_info
self.new_info = new_info
self.path = str(path)
def doc2docx(self, files):
"""doc转换docx"""
for file_name in files:
word = wc.Dispatch('Word.Application')
docx_name = file_name.split('.')[0]+'.docx'
path = u'%s/' % self.path + file_name
docx_path = u'%s/' % docx + docx_name
if os.path.exists(docx_path):
print('exists')
continue
print(path)
print(docx_path)
doc = word.Documents.Open(path)
# 目标路径下的文件
doc.SaveAs(docx_path, 12)
doc.Close()
word.Quit()
sleep(2)
def rename(self, files):
"""批量修改文件名"""
for file_name in files:
oldname = '%s/' % self.path + file_name
# newname = '%s/' % self.path + \
# file_name.replace(' ', '')
newname = '%s/' % self.path + \
file_name.replace(self.old_info, self.new_info)
os.rename(oldname, newname) # 用os模块中的rename方法对文件改名
def get_files(self):
"""从文件夹路径获取文件列表"""
files = []
# 从文件夹路径获取文件列表,并剔除非docx格式的文件
for file in os.listdir(self.path):
if file.endswith('.docx'):
files.append(file)
else:
print(file)
print(len(files))
# self.rename(files)
# self.doc2docx(files)
self.read(files)
def read(self, files):
"""读取所有文件"""
for file in files:
doc = Document(self.path+'/'+file)
self.update(doc)
doc.save(self.path+'/'+file)
print("%s替换完成" % file)
def update(self, doc):
"""替换文件内容"""
# 读取所有段落里面的内容并替换
for p in doc.paragraphs:
for run in p.runs:
run.text = run.text.replace(self.old_info, self.new_info)
# 读取所有表格里面的内容并替换
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
cell.text = cell.text.replace(
self.old_info, self.new_info) # 替换信息
mydoc = Mydocx('原来的项目名称', '现在的项目名称')
mydoc.get_files()