使用python提取所有word文件中的所有图片
目录
- 前言
- 代码
- GIF示例
- 附:doc转docx
- 代码
前言
办公中,偶尔会碰到一种情况,需要提取word文档中的图片,决定写这样一款工具自动提取图片。
关于脚本的使用:
情景1:如果你拿到的是一个文件夹,所有的word文件都在这个文件夹的子目录下,深度为1层,你可以直接使用该脚本
情景2:如果你拿到的是一个文件夹,打开之后,里面杂乱无章的充斥着各种文件,你也不确定word文档都在哪,那么你需要使用Everything来手动提取出所有的word文档,虽然我也可以让脚本实现这个功能,但是使用脚本需要考虑到有可能存在同名文件,再处理起来代码量会更大,还是用Everything手动移动文件吧,谁让现在的代码量已经远超我预期了呢?
3:预处理前面的两步之后,就可以直接运行脚本了
4:脚本注释很详细,这里不再赘述
5:目前仅支持docx格式的,主要原因是,如果支持doc的话,需要把doc转为docx,转换略慢,并且,我也用不到。如果你感兴趣的话,我再最下面介绍了互转的方法,你可以把这个函数加进去即可
代码
import zipfile
import os
import shutil
import hashlib
import send2trash'''
假设所有的word文档存放在某路径中,这个路径中包含各种杂七杂八的玩意
使用Everything,或者"筛选文件.py"把所有的docx文件移动到C:\\Users\\asuka\\Desktop\\123
逐个解压每个docx文档,并提取图片强烈建议使用Everything用来筛选出所有的word文档,这样假如有两个重名的文档,可以手动处理
如果编写软件来实现的话,会麻烦很多
'''# 一个用来解压文件的函数
def extract_zip(zip_path):os.chdir(os.path.dirname(zip_path)) # 需要进入到这个路径下,这样解压的文件,才在这个路径下a = zipfile.ZipFile(zip_path) # 调用zipfile.ZipFile()函数,创建一个ZipFile对象a.extractall()a.close()os.chdir(path) # 恢复到之前的路径# 用来获取所有的图片
'''
测试的时候发现,不同word文件解压之后,里面的图片命名格式一致,
导致不能直接移动图片,否则会造成文件覆盖,这里需要对找到的每一个文件,进行重命名
'''def get_picture(demo_path):count = 1 # 用来个图片进行重命名for current_folder, list_folders, files in os.walk(demo_path):for f in files:if f.endswith('png') or f.endswith('jpg') or f.endswith('jpeg'): # 设置图片类型是这种move_f = current_folder + '\\' + f # 给出要移动的文件的路径new_file_path = path1 + '\\' + str(count) + '.' + f.rpartition('.')[-1] # 指定新文件的文件路径,文件名数字递增,文件后缀shutil.move(move_f, new_file_path) # 移动文件count += 1print('[-] 总共获取图片{}张'.format(count - 1))# 对图片去重
# 计算每个图片的md5值,据此进行去重,去重的文件会被删除到回收站中
def only_one(test_path):md5_list = []count = 0for current_folder, list_folders, files in os.walk(test_path):for file in files:picture_path = current_folder + '\\' + file # 获取每个图片的路径f = open(picture_path, 'rb') # 开始计算每个图片的md5值md5obj = hashlib.md5()md5obj.update(f.read())get_hash = md5obj.hexdigest()f.close()md5_value = str(get_hash).upper()# 开始去重if md5_value in md5_list:send2trash.send2trash(picture_path) # 如果这个文件的md5值曾经出现过,就删除这张图片count += 1print('[-] 删除重复图片:' + str(file))else:md5_list.append(md5_value) # 如果这个图片的md5值不存在列表中,就添加进列表中print('[-] 共删除重复图片:{}张'.format(count))print('[+] 只有后缀是docx的word文档才可以提取图片!!!')
path = input('[+] 请输入word文档所在文件夹:') # 获取原始的word文档所在路径
os.chdir(path)print("[+] 请输入一个路径,用来存放所有的图片")
print("[+] 或者按回车键,我将自动把图片整理之后存放在你的桌面")
path1 = input('') # path1 用来存放所有的图片文件
if len(path1):pass
else:desktop_path = os.path.join(os.path.expanduser("~"), 'Desktop') # 获取桌面路径path1 = os.path.join(desktop_path, '所有word文件中的图片')os.makedirs(path1)files = os.listdir(path) # 获取指定文件夹下的所有文件
for file in files: # 遍历指定文件夹下的所有文件if file.endswith('docx'): # 加一个判断,这样即使path路径下有别的类型文件也无妨filename = file.rpartition('.')[0] # 获取文件的文件名file_path = os.path.join(path, filename)os.makedirs(file_path) # 为获取到的文件名创建一个文件夹shutil.move(file, file_path) # 把word文档移动到同名文件夹中word_path = os.path.join(file_path, file) # 获取此时word文件的文件路径extract_zip(word_path) # 不用改后缀,直接解压docx文件get_picture(path)
only_one(path1)
print('[-] 现有图片:{}张'.format(len(os.listdir(path1))))
GIF示例
Everything提取文件的演示(手动处理同名word文件,我这里对同名文件进行替换):
附:doc转docx
介绍一下实现二者互转
需要说明的是:
要安装OFFICE,如果是使用金山WPS的,则还不能应用
转换速度略慢,但还能接受
如果想转换为其他格式文件,需要在format文件名内修改,并用如下save as 参数
代码
关于第9行、第19行代码:
第9行
doc.SaveAs("{}x".format(fn), 12)
:
"{}x".format(fn)
相当于把C:\Users\asuka\Desktop\11\123.doc
变成了C:\Users\asuka\Desktop\11\123.docx
,首先是指定了路径和文件名,然后12表示存储成docx格式的,保证了后缀名和格式是对应的。第19行
doc.SaveAs("{}".format(fn[:-1]), 0)
:
"{}".format(fn[:-1])
相当于把C:\Users\asuka\Desktop\11\456.docx
变成了C:\Users\asuka\Desktop\11\456.doc
,指定了要另外保存的文件,保存的路径和文件名,然后0表示存储成doc格式的,保证了后缀名和格式是对应的。
from win32com import client# 转换doc为docx
def doc2docx(fn):word = client.Dispatch("Word.Application") # 打开word应用程序# for file in files:doc = word.Documents.Open(fn) # 打开word文件doc.SaveAs("{}x".format(fn), 12) # 另存为后缀为".docx"的文件,其中参数12或16指docx文件doc.Close() # 关闭原来word文件word.Quit()# 转换docx为doc
def docx2doc(fn):word = client.Dispatch("Word.Application") # 打开word应用程序# for file in files:doc = word.Documents.Open(fn) # 打开word文件doc.SaveAs("{}".format(fn[:-1]), 0) # 另存为后缀为".docx"的文件,其中参数0指docprint(fn[:-1])doc.Close() # 关闭原来word文件word.Quit()doc2docx(r'C:\Users\asuka\Desktop\11\123.doc')
docx2doc(r'C:\Users\asuka\Desktop\11\456.docx')
使用python提取所有word文件中的所有图片相关推荐
- python 提取批量xml文件中的坐标信息存入txt文件 xml文件转txt文件
读取多个xml文件中的坐标信息:xmin.xmax.ymin.ymax(实际为一个矩形框的坐标值),并通过简单的计算得到矩形框的长.宽,最后按照自己的需求读入到一个txt文档中 xml文件目录及文件如 ...
- python 知乎 合并 pdf_实例4:用Python提取不同PDF文件中的页面合并进新的PDF文件...
公司船务部一个重要任务就是需要准备每单货物的发票,从系统导出发票时是默认存为一个PDF文档,在打印的时候,有多少个文件,就需要点多少次"打印".如果能够将当天的发票PDF档合并在一 ...
- 记录 || Python | 提取xml/tmx文件中的文本内容
# -*- coding:utf-8 -*- import codecs import xml.etree.ElementTree as ET import sysdefaultencoding = ...
- Python自动对Word文件中Python程序进行着色
好消息:"Python小屋"编程比赛正式开始 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社, ...
- Python提取Word文件中的目录标题保存为Excel文件
from docx import Document from openpyxl import Workbook from openpyxl.styles import Alignment, Borde ...
- python docx 合并文档 图片_Python检查Word文件中包含特定关键字的所有页码
推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社图书详情:配套资源:用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系 ...
- Python检查Word文件中包含特定关键字的所有页码
推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 配套资源: 用书教师可以联系董老师获取教学大纲.课件.源码.教案. ...
- python文本筛选多个word_用Python批量替换多个Word文件中的文字
实例14:用Python批量替换多个Word文件中的文字 公众号"Python操作Office软件高效工作" 29 人赞同了该文章 我们在实例7中批量生成了采购合同.但是假设现在我 ...
- word批量替换多组文字 python_实例14:用Python批量替换多个Word文件中的文字
我们在实例7中批量生成了采购合同.但是假设现在我方的公司名由"ABC商贸有限公司"变成了"ABC贸易有限公司",那我们就需要去每份合同中对应位置进行替换.当然也 ...
最新文章
- 非常实用的 Python 技巧
- 数据分析的 8 种思维
- 转载:2014年流行的手机App小图标界面设计欣赏(1)
- ABAP代码自动完成实现原理
- iOS 开发之获取时间到年底可能会踩到的坑
- wampserver的phpmyadmin(默认3306)端口如何更改为3307?
- html5boder属性,你未必知道的CSS小知识:border属性比你想象的要复杂
- america/los_angeles 时区 java_在Java ME中将“America / Los Angeles”时区转换为“PST”或“PDT”...
- python和c++情侣网名_[宜配屋]听图阁
- 前端入门14-JavaScript进阶之继承
- 百度免费ocr和阿里付费的使用方法
- thinkphp6阿里云短信新版sdk对接(tp5对接新版阿里云短信sdk)
- Bom及Bom对象的详细介绍
- 加密WebSphere Application Server系统密码
- 【微信授权登录失败】Universal Link check failed 第5步问题解决(授权二次确认弹框问题)
- Python 自动化办公 —— PyPDF2 库的基本使用
- 如何用计算机克数和斤换算,质量(重量)单位换算计算器
- 随机从map中获取key值
- 指数增强策略(股票)
- 【Spring】Spring事务管理
热门文章
- 知识蒸馏论文学习(同济子豪兄)
- 什么叫ODF、DDF、MDF
- 韩语计算机术语大全,韩语学习:韩语计算机、互联网术语 - 英语家园
- 微信小程序商机_盘点微信小程序的八大商机
- 二进制与8,10,16转换
- 如何将高版本的CAD文件转成低版本的CAD文件
- Communication error with Jack server , try ‘jack-diagnose‘ or see Jack server log 报错解决办法
- 【算法概论】分治算法:k路归并
- 什么是业务流程管理BPM
- 国际期刊预警名单网址