老板又出难题,气得我写了个自动化软件!
关键时间,第一时间送达!
作者:小小明,Pandas数据处理专家,致力于帮助无数数据从业者解决数据处理难题
编辑:朱小五,一只不务正业的数据狗
doc格式批量转为docx
from pathlib import Path
import os
import shutil
doc_path = r'E:\tmp\答疑整理'
temp_dir = 'temp'
if os.path.exists(f'{doc_path}/{temp_dir}'):
shutil.rmtree(f'{doc_path}/{temp_dir}')
os.mkdir(f'{doc_path}/{temp_dir}')
word = wc.Dispatch('Word.Application') # 打开word应用程序
try:
for filename in Path(doc_path).glob('*.doc'):
file = str(filename)
dest_name = str(filename.parent/f'{temp_dir}'/str(filename.name))+'x'
print(file, dest_name)
doc = word.Documents.Open(file) # 打开word文件
doc.SaveAs(dest_name, 12) # 另存为后缀为'.docx'的文件,其中参数12指docx文件
finally:
word.Quit()
批量提取docx文档的图片
from zipfile import ZipFile
import shutil
if os.path.exists(f'{doc_path}/{temp_dir}/imgs'):
shutil.rmtree(f'{doc_path}/{temp_dir}/imgs')
os.makedirs(f'{doc_path}/{temp_dir}/imgs')
i = 1
for filename in itertools.chain(Path(doc_path).glob('*.docx'), (Path(doc_path)/temp_dir).glob('*.docx')):
print(filename)
with ZipFile(filename) as zip_file:
for names in zip_file.namelist():
if names.startswith('word/media/image'):
zip_file.extract(names, doc_path)
os.rename(f'{doc_path}/{names}',
f'{doc_path}/{temp_dir}/imgs/{i}{names[names.find('.'):]}')
print('\t', names, f'{i}{names[names.find('.'):]}')
i += 1
shutil.rmtree(f'{doc_path}/word')
批量图片格式转换
if not os.path.exists(f'{doc_path}/imgs'):
os.mkdir(f'{doc_path}/imgs')
for filename in Path(f'{doc_path}/{temp_dir}/imgs').glob('*'):
file = str(filename)
with Image.open(file) as im:
im.convert('RGB').save(
f'{doc_path}/imgs/{filename.name[:filename.name.find('.')]}.jpg', 'jpeg')
完整代码
# -*- coding: utf-8 -*-
# 创建时间:2020/12/25 21:46
__author__ = 'xiaoxiaoming'
import itertools
import os
import shutil
from pathlib import Path
from zipfile import ZipFile
from PIL import Image
from win32com import client as wc # 导入模块
def word_img_extract(doc_path, temp_dir):
if os.path.exists(f'{doc_path}/{temp_dir}'):
shutil.rmtree(f'{doc_path}/{temp_dir}')
os.mkdir(f'{doc_path}/{temp_dir}')
word = wc.Dispatch('Word.Application') # 打开word应用程序
try:
for filename in Path(doc_path).glob('*.doc'):
file = str(filename)
dest_name = str(filename.parent / f'{temp_dir}' / str(filename.name)) + 'x'
print(file, dest_name)
doc = word.Documents.Open(file) # 打开word文件
doc.SaveAs(dest_name, 12) # 另存为后缀为'.docx'的文件,其中参数12指docx文件
finally:
word.Quit()
if os.path.exists(f'{doc_path}/{temp_dir}/imgs'):
shutil.rmtree(f'{doc_path}/{temp_dir}/imgs')
os.makedirs(f'{doc_path}/{temp_dir}/imgs')
i = 1
for filename in itertools.chain(Path(doc_path).glob('*.docx'), (Path(doc_path) / temp_dir).glob('*.docx')):
print(filename)
with ZipFile(filename) as zip_file:
for names in zip_file.namelist():
if names.startswith('word/media/image'):
zip_file.extract(names, doc_path)
os.rename(f'{doc_path}/{names}',
f'{doc_path}/{temp_dir}/imgs/{i}{names[names.find('.'):]}')
print('\t', names, f'{i}{names[names.find('.'):]}')
i += 1
shutil.rmtree(f'{doc_path}/word')
if not os.path.exists(f'{doc_path}/imgs'):
os.mkdir(f'{doc_path}/imgs')
for filename in Path(f'{doc_path}/{temp_dir}/imgs').glob('*'):
file = str(filename)
with Image.open(file) as im:
im.convert('RGB').save(
f'{doc_path}/imgs/{filename.name[:filename.name.find('.')]}.jpg', 'jpeg')
if __name__ == '__main__':
doc_path = r'E:\tmp\答疑整理'
temp_dir = 'temp'
word_img_extract(doc_path, temp_dir)
GUI图形化工具开发
from word_img_extract import word_img_extract
sg.change_look_and_feel('GreenMono')
layout = [
[
sg.Text('请输入word文档所在的目录:'),
sg.In(size=(25, 1), enable_events=True, key='-FOLDER-'),
sg.FolderBrowse('浏览'),
], [
sg.Button('开始抽取', enable_events=True, key='抽取'),
sg.Text(size=(40, 1), key='-TOUT-')
]
]
window = sg.Window('word文档图片抽取系统', layout)
while True:
event, values = window.read()
if event in (None,):
break # 相当于关闭界面
elif event == '抽取':
if values['-FOLDER-']:
window['-TOUT-'].update('准备抽取!!!')
sg.popup('抽取期间程序将处于假死状态,请稍等片刻,提取完成后会弹出提示!!!\n点击ok后开始抽取!!!')
window['-TOUT-'].update('正在抽取中...')
word_img_extract(values['-FOLDER-'])
window['-TOUT-'].update('抽取完毕!!!')
sg.popup('抽取完毕!!!')
else:
sg.popup('请先输入word文档所在的路径!!!')
print(f'Event: {event}, values: {values}')
window.close()
打包exe
conda activate gui
注意:创建虚拟环境和激活环境并不是必须,只是为了精简环境,可以跳过
pip install pillow
pip install pywin32
pip install pyinstaller
-F 表示生成单个可执行文件 -w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧! -p 表示你自己自定义需要加载的类路径,一般情况下用不到 -i 表示可执行文件的图标
给GUI加入进度条
import os
import shutil
from pathlib import Path
from zipfile import ZipFile
from PIL import Image
from win32com import client as wc # 导入模块
def word_img_extract(doc_path, temp_dir='temp'):
if os.path.exists(f'{doc_path}/{temp_dir}'):
shutil.rmtree(f'{doc_path}/{temp_dir}')
os.mkdir(f'{doc_path}/{temp_dir}')
word = wc.Dispatch('Word.Application') # 打开word应用程序
try:
files = list(Path(doc_path).glob('*.doc'))
if len(files) == 0:
raise Exception('当前目录中没有word文档')
for i, filename in enumerate(files, 1):
file = str(filename)
dest_name = str(filename.parent / f'{temp_dir}' / str(filename.name)) + 'x'
# print(file, dest_name)
doc = word.Documents.Open(file) # 打开word文件
doc.SaveAs(dest_name, 12) # 另存为后缀为'.docx'的文件,其中参数12指docx文件
yield 'word doc格式转docx格式:', i * 1000 // len(files)
finally:
word.Quit()
if os.path.exists(f'{doc_path}/{temp_dir}/imgs'):
shutil.rmtree(f'{doc_path}/{temp_dir}/imgs')
os.makedirs(f'{doc_path}/{temp_dir}/imgs')
i = 1
files = list(itertools.chain(Path(doc_path).glob('*.docx'), (Path(doc_path) / temp_dir).glob('*.docx')))
for j, filename in enumerate(files, 1):
# print(filename)
with ZipFile(filename) as zip_file:
for names in zip_file.namelist():
if names.startswith('word/media/image'):
zip_file.extract(names, doc_path)
os.rename(f'{doc_path}/{names}',
f'{doc_path}/{temp_dir}/imgs/{i}{names[names.find('.'):]}')
# print('\t', names, f'{i}{names[names.find('.'):]}')
i += 1
yield 'word提取图片:', j * 1000 // len(files)
shutil.rmtree(f'{doc_path}/word')
if not os.path.exists(f'{doc_path}/imgs'):
os.mkdir(f'{doc_path}/imgs')
files = list(Path(f'{doc_path}/{temp_dir}/imgs').glob('*'))
for i, filename in enumerate(files, 1):
file = str(filename)
with Image.open(file) as im:
im.convert('RGB').save(
f'{doc_path}/imgs/{filename.name[:filename.name.find('.')]}.jpg', 'jpeg')
yield '图片转换为jpg格式:', i * 1000 // len(files)
if __name__ == '__main__':
doc_path = r'E:\tmp\答疑整理'
for msg, i in word_img_extract(doc_path):
print(f'\r {msg}{i}', end='')
from word_img_extract import word_img_extract
sg.change_look_and_feel('GreenMono')
layout = [
[
sg.Text('请输入word文档所在的目录:'),
sg.In(size=(25, 1), enable_events=True, key='-FOLDER-'),
sg.FolderBrowse('浏览'),
], [
sg.Button('开始抽取', enable_events=True, key='抽取'),
sg.Text(text_color='red', size=(47, 2), key='error'),
], [
sg.Text('准备:', size=(20, 1), key='-TOUT-'),
sg.ProgressBar(1000, orientation='h', size=(35, 20), key='progressbar')
]
]
window = sg.Window('word文档图片抽取系统', layout)
while True:
event, values = window.read()
if event in (None,):
break # 相当于关闭界面
elif event == '抽取':
if values['-FOLDER-']:
window['error'].update('')
try:
for msg, i in word_img_extract(values['-FOLDER-']):
window['-TOUT-'].update(msg)
window['progressbar'].UpdateBar(i)
window['-TOUT-'].update('抽取完毕!!!')
except Exception as e:
window['error'].update(str(e))
else:
sg.popup('请先输入word文档所在的路径!!!')
window.close()
我是东哥,最后给大家分享《100本Python电子书》,包括Python编程技巧、数据分析、爬虫、Web开发、机器学习、深度学习。
现在免费分享出来,有需要的读者可以下载学习,在下面的公众号「GitHuboy」里回复关键字:Python,就行。