目录

  • 前言
  • 代码
  • 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行代码:

  1. 第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格式的,保证了后缀名和格式是对应的。

  2. 第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文件中的所有图片相关推荐

  1. python 提取批量xml文件中的坐标信息存入txt文件 xml文件转txt文件

    读取多个xml文件中的坐标信息:xmin.xmax.ymin.ymax(实际为一个矩形框的坐标值),并通过简单的计算得到矩形框的长.宽,最后按照自己的需求读入到一个txt文档中 xml文件目录及文件如 ...

  2. python 知乎 合并 pdf_实例4:用Python提取不同PDF文件中的页面合并进新的PDF文件...

    公司船务部一个重要任务就是需要准备每单货物的发票,从系统导出发票时是默认存为一个PDF文档,在打印的时候,有多少个文件,就需要点多少次"打印".如果能够将当天的发票PDF档合并在一 ...

  3. 记录 || Python | 提取xml/tmx文件中的文本内容

    # -*- coding:utf-8 -*- import codecs import xml.etree.ElementTree as ET import sysdefaultencoding = ...

  4. Python自动对Word文件中Python程序进行着色

    好消息:"Python小屋"编程比赛正式开始 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社, ...

  5. Python提取Word文件中的目录标题保存为Excel文件

    from docx import Document from openpyxl import Workbook from openpyxl.styles import Alignment, Borde ...

  6. python docx 合并文档 图片_Python检查Word文件中包含特定关键字的所有页码

    推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社图书详情:配套资源:用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系 ...

  7. Python检查Word文件中包含特定关键字的所有页码

    推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 配套资源: 用书教师可以联系董老师获取教学大纲.课件.源码.教案. ...

  8. python文本筛选多个word_用Python批量替换多个Word文件中的文字

    实例14:用Python批量替换多个Word文件中的文字 公众号"Python操作Office软件高效工作" 29 人赞同了该文章 我们在实例7中批量生成了采购合同.但是假设现在我 ...

  9. word批量替换多组文字 python_实例14:用Python批量替换多个Word文件中的文字

    我们在实例7中批量生成了采购合同.但是假设现在我方的公司名由"ABC商贸有限公司"变成了"ABC贸易有限公司",那我们就需要去每份合同中对应位置进行替换.当然也 ...

最新文章

  1. 非常实用的 Python 技巧
  2. 数据分析的 8 种思维
  3. 转载:2014年流行的手机App小图标界面设计欣赏(1)
  4. ABAP代码自动完成实现原理
  5. iOS 开发之获取时间到年底可能会踩到的坑
  6. wampserver的phpmyadmin(默认3306)端口如何更改为3307?
  7. html5boder属性,你未必知道的CSS小知识:border属性比你想象的要复杂
  8. america/los_angeles 时区 java_在Java ME中将“America / Los Angeles”时区转换为“PST”或“PDT”...
  9. python和c++情侣网名_[宜配屋]听图阁
  10. 前端入门14-JavaScript进阶之继承
  11. 百度免费ocr和阿里付费的使用方法
  12. thinkphp6阿里云短信新版sdk对接(tp5对接新版阿里云短信sdk)
  13. Bom及Bom对象的详细介绍
  14. 加密WebSphere Application Server系统密码
  15. 【微信授权登录失败】Universal Link check failed 第5步问题解决(授权二次确认弹框问题)
  16. Python 自动化办公 —— PyPDF2 库的基本使用
  17. 如何用计算机克数和斤换算,质量(重量)单位换算计算器
  18. 随机从map中获取key值
  19. 指数增强策略(股票)
  20. 【Spring】Spring事务管理

热门文章

  1. 知识蒸馏论文学习(同济子豪兄)
  2. 什么叫ODF、DDF、MDF
  3. 韩语计算机术语大全,韩语学习:韩语计算机、互联网术语 - 英语家园
  4. 微信小程序商机_盘点微信小程序的八大商机
  5. 二进制与8,10,16转换
  6. 如何将高版本的CAD文件转成低版本的CAD文件
  7. Communication error with Jack server , try ‘jack-diagnose‘ or see Jack server log 报错解决办法
  8. 【算法概论】分治算法:k路归并
  9. 什么是业务流程管理BPM
  10. 国际期刊预警名单网址