鱼C论坛

 找回密码
 立即注册
查看: 4647|回复: 21

[已解决]excel提取图片并按照设定的顺序命名

[复制链接]
发表于 2023-2-10 16:45:01 | 显示全部楼层 |阅读模式
10鱼币
提取图中文件的照片然后重新命名,我这个没有头绪不知道怎么写,求大佬指点
最佳答案
2023-2-10 16:45:02
帅昊昊昊 发表于 2023-2-12 07:41
感谢大佬的代码,我再细细分析一下,就是不知道能不能帮忙拓展一下,这个提取的过程中按照我设定好的格式 ...

  1. import os
  2. import shutil
  3. import zipfile

  4. from zipfile import ZipFile

  5. excel_dir = "."                    # 存放 excel 文件的路径,. 为当前路径
  6. image_dir = "image"                # 存放图片的路径
  7. name_format = "第{}张芯样"         # 名字的格式,需要填序号的地方用 {}

  8. if not os.path.exists(image_dir):
  9.     os.mkdir(image_dir)
  10.   
  11. def extract_imag(excel_path, image_dir, name_format=""):
  12.     image_path = os.path.join(image_dir, os.path.basename(excel_path).rsplit(".", 1)[0])
  13.     if os.path.exists(image_path):
  14.         shutil.rmtree(image_path)
  15.     os.mkdir(image_path)
  16.     try:
  17.         with ZipFile(excel_path) as zf:      
  18.             for file in zf.namelist():
  19.                 if file.startswith("xl/media/") and file != "xl/media/":
  20.                     if name_format:
  21.                         img_num, ext_name = os.path.splitext(os.path.basename(file)[5:])
  22.                         path = os.path.join(image_path, name_format.format(img_num)+ext_name)
  23.                     else:
  24.                         path = os.path.join(image_path, os.path.basename(file))
  25.                     with open(path, 'wb') as f:
  26.                         f.write(zf.read(file))
  27.         print(f'{excel_path} 提取图片成功!')
  28.     except zipfile.BadZipFile:
  29.         print(f'{excel_path} 不是一个xlsx格式的文件!')
  30.    
  31.    
  32. for i in os.listdir(excel_dir):
  33.     if i.endswith('.xlsx'):
  34.         extract_imag(i, image_dir, name_format)
复制代码
YU@V68[1{KK02H3CF(SX(55.png

最佳答案

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-10 16:45:02 | 显示全部楼层    本楼为最佳答案   
帅昊昊昊 发表于 2023-2-12 07:41
感谢大佬的代码,我再细细分析一下,就是不知道能不能帮忙拓展一下,这个提取的过程中按照我设定好的格式 ...

  1. import os
  2. import shutil
  3. import zipfile

  4. from zipfile import ZipFile

  5. excel_dir = "."                    # 存放 excel 文件的路径,. 为当前路径
  6. image_dir = "image"                # 存放图片的路径
  7. name_format = "第{}张芯样"         # 名字的格式,需要填序号的地方用 {}

  8. if not os.path.exists(image_dir):
  9.     os.mkdir(image_dir)
  10.   
  11. def extract_imag(excel_path, image_dir, name_format=""):
  12.     image_path = os.path.join(image_dir, os.path.basename(excel_path).rsplit(".", 1)[0])
  13.     if os.path.exists(image_path):
  14.         shutil.rmtree(image_path)
  15.     os.mkdir(image_path)
  16.     try:
  17.         with ZipFile(excel_path) as zf:      
  18.             for file in zf.namelist():
  19.                 if file.startswith("xl/media/") and file != "xl/media/":
  20.                     if name_format:
  21.                         img_num, ext_name = os.path.splitext(os.path.basename(file)[5:])
  22.                         path = os.path.join(image_path, name_format.format(img_num)+ext_name)
  23.                     else:
  24.                         path = os.path.join(image_path, os.path.basename(file))
  25.                     with open(path, 'wb') as f:
  26.                         f.write(zf.read(file))
  27.         print(f'{excel_path} 提取图片成功!')
  28.     except zipfile.BadZipFile:
  29.         print(f'{excel_path} 不是一个xlsx格式的文件!')
  30.    
  31.    
  32. for i in os.listdir(excel_dir):
  33.     if i.endswith('.xlsx'):
  34.         extract_imag(i, image_dir, name_format)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-10 16:47:53 From FishC Mobile | 显示全部楼层
把样品发出来啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-10 16:54:48 | 显示全部楼层

你是要这个文件吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-10 20:21:56 | 显示全部楼层
本帖最后由 txxcat 于 2023-2-11 08:13 编辑

office的文档实际上是个zip包,使用zipfile解压,xl\media下面就是你要的图片,剩下的工作就简单了。
可以参见这个帖子里的代码:python在word文档里插入文件对象
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-11 08:32:50 | 显示全部楼层
txxcat 发表于 2023-2-10 20:21
office的文档实际上是个zip包,使用zipfile解压,xl\media下面就是你要的图片,剩下的工作就简单了。
可以 ...

你这个是写入,读取的话怎么搞,昨天我网上找了一下类似情况的,也是用zipfile压缩后,去xl\media下找图片,但是压缩是成功了,但是提取图片出问题了,这是网上的,我就是修改了一下路径,然后就报错了。报错内容Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\新建文本文档.py", line 31, in <module>
    img = Image.open(f)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\PIL\Image.py", line 3283, in open
    raise UnidentifiedImageError(msg)
PIL.UnidentifiedImageError: cannot identify image file <zipfile.ZipExtFile name='xl/media/' mode='r'
希望大佬指点一下
  1. import os
  2. import zipfile
  3. import os
  4. from PIL import Image
  5. import numpy as np
  6. path = r'C:/Users/Administrator/Desktop/'
  7. count = 1
  8. for file in os.listdir(path):
  9.     new_file = file.replace(".xlsx",".zip")
  10.     os.rename(os.path.join(path,file),os.path.join(path,new_file))
  11.     count+=1
  12. print('总共有'+str(count)+'个文件夹')
  13. number = 0
  14. craterDir = "C:/Users/Administrator/Desktop/"  # 存放zip文件的文件夹路径
  15. saveDir = "C:/Users/Administrator/Desktop/"  # 存放图片的路径
  16. list_dir = os.listdir(craterDir)
  17. for i in range(len(list_dir)):
  18.     if 'zip' not in list_dir[i]:
  19.         list_dir[i] = ''
  20. while '' in list_dir:
  21.     list_dir.remove('')   
  22. for zip_name in list_dir:
  23.     print(zip_name)
  24.     azip = zipfile.ZipFile(craterDir + zip_name)
  25.     namelist = (azip.namelist())

  26.     for idx in range(0,len(namelist)):
  27.         if namelist[idx][:9] == 'xl/media/':#图片是在这个路径下
  28.             img_name = saveDir + str(number)+'.jpg'
  29.             f = azip.open(namelist[idx],'r')
  30.             img = Image.open(f)
  31.             img = img.convert("RGB")
  32.             img.save(img_name,"JPEG")
  33.             number += 1
  34. azip.close()  #关闭文件,必须有,释放内存
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 14:05:35 | 显示全部楼层
我也不知道啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 17:20:04 From FishC Mobile | 显示全部楼层
帅昊昊昊 发表于 2023-2-11 08:32
你这个是写入,读取的话怎么搞,昨天我网上找了一下类似情况的,也是用zipfile压缩后,去xl\media下找图 ...

看你要实现啥,这代码最后咋还涉及到格式转换
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-11 17:53:38 | 显示全部楼层
wp231957 发表于 2023-2-11 17:20
看你要实现啥,这代码最后咋还涉及到格式转换

就是第一个功能是将excel里的图片提取出来,然后按顺序给他命名,可以一次达成最好,不能分两次也可以
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 18:07:22 From FishC Mobile | 显示全部楼层
帅昊昊昊 发表于 2023-2-11 17:53
就是第一个功能是将excel里的图片提取出来,然后按顺序给他命名,可以一次达成最好,不能分两次也可以

这个并没啥难度,但是我没有源文件
我家电脑里装的是wps   wps不能像微软那样提取插入图片
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 19:00:41 | 显示全部楼层
  1. import os
  2. from zipfile import ZipFile

  3. excel_dir = "."                    # 存放 excel 文件的路径,. 为当前路径
  4. image_dir = "image"                # 存放图片的路径

  5. if not os.path.exists(image_dir):
  6.     os.mkdir(image_dir)
  7.   
  8. def extract_imag(excel_path, image_dir):
  9.     image_path = os.path.join(image_dir, os.path.basename(excel_path).rsplit(".", 1)[0])
  10.     os.mkdir(image_path)
  11.     with ZipFile(excel_path) as zf:      
  12.         for file in zf.namelist():
  13.             if file.startswith("xl/media/") and file != "xl/media/":
  14.                 with open(os.path.join(image_path, os.path.basename(file)), 'wb') as f:
  15.                     f.write(zf.read(file))
  16.    
  17.    
  18. for i in os.listdir(excel_dir):
  19.     if i.endswith('.xlsx'):
  20.         extract_imag(i, image_dir)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-11 20:32:51 | 显示全部楼层

大佬,这个创建文件夹成功了,但是提取照片失败了,错误原因如下,我的判断他说,这个文件不是zip文件
Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\2.py", line 22, in <module>
    extract_imag(i, image_dir)
  File "C:\Users\Administrator\Desktop\2.py", line 13, in extract_imag
    with ZipFile(excel_path) as zf:
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\zipfile.py", line 1299, in __init__
    self._RealGetContents()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\zipfile.py", line 1366, in _RealGetContents
    raise BadZipFile("File is not a zip file")
zipfile.BadZipFile: File is not a zip file
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-11 20:33:28 | 显示全部楼层
wp231957 发表于 2023-2-11 18:07
这个并没啥难度,但是我没有源文件
我家电脑里装的是wps   wps不能像微软那样提取插入图片

意思是如果用wps打开excel就会提取不成功,那两个都有能成功吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 20:37:56 | 显示全部楼层
帅昊昊昊 发表于 2023-2-11 20:32
大佬,这个创建文件夹成功了,但是提取照片失败了,错误原因如下,我的判断他说,这个文件不是zip文件
T ...

是不是有一个损坏的 xlsx 文件?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 21:10:08 | 显示全部楼层
帅昊昊昊 发表于 2023-2-11 20:32
大佬,这个创建文件夹成功了,但是提取照片失败了,错误原因如下,我的判断他说,这个文件不是zip文件
T ...

这个代码只能用于提取 xlsx 格式的表格的图片,应该是你那个目录存在不是 xlsx 格式却以 xlsx 为扩展名的文件,

我在代码中加了一个异常捕获:

  1. import os
  2. import shutil
  3. import zipfile

  4. from zipfile import ZipFile

  5. excel_dir = "."                    # 存放 excel 文件的路径,. 为当前路径
  6. image_dir = "image"                # 存放图片的路径

  7. if not os.path.exists(image_dir):
  8.     os.mkdir(image_dir)
  9.   
  10. def extract_imag(excel_path, image_dir):
  11.     image_path = os.path.join(image_dir, os.path.basename(excel_path).rsplit(".", 1)[0])
  12.     if os.path.exists(image_path):
  13.         shutil.rmtree(image_path)
  14.     os.mkdir(image_path)
  15.     try:
  16.         with ZipFile(excel_path) as zf:      
  17.             for file in zf.namelist():
  18.                 if file.startswith("xl/media/") and file != "xl/media/":
  19.                     with open(os.path.join(image_path, os.path.basename(file)), 'wb') as f:
  20.                         f.write(zf.read(file))
  21.         print(f'{excel_path} 提取图片成功!')
  22.     except zipfile.BadZipFile:
  23.         print(f'{excel_path} 不是一个xlsx格式的文件!')
  24.    
  25.    
  26. for i in os.listdir(excel_dir):
  27.     if i.endswith('.xlsx'):
  28.         extract_imag(i, image_dir)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 21:32:57 | 显示全部楼层
office2016测试10楼和14楼代码都没问题。
  1. C:\Users\Administrator\Desktop\Python\execl读取图片\image\test 的目录

  2. 2023/02/11  21:29    <DIR>          .
  3. 2023/02/11  21:29    <DIR>          ..
  4. 2023/02/11  21:29           258,762 image1.jpeg
  5. 2023/02/11  21:29           238,690 image2.jpeg
  6. 2023/02/11  21:29           405,768 image3.jpeg
  7. 2023/02/11  21:29           572,757 image4.jpeg
  8.                4 个文件      1,475,977 字节
  9.                2 个目录 142,597,222,400 可用字节
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 21:47:05 From FishC Mobile | 显示全部楼层
帅昊昊昊 发表于 2023-2-11 20:33
意思是如果用wps打开excel就会提取不成功,那两个都有能成功吗

是的,如果是wps下面的表格,就不能用这个办法
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-12 07:41:15 | 显示全部楼层
isdkz 发表于 2023-2-11 21:10
这个代码只能用于提取 xlsx 格式的表格的图片,应该是你那个目录存在不是 xlsx 格式却以 xlsx 为扩展名的 ...

感谢大佬的代码,我再细细分析一下,就是不知道能不能帮忙拓展一下,这个提取的过程中按照我设定好的格式去提取,比如第一张命名为第1盒芯样
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-12 07:42:56 | 显示全部楼层
wp231957 发表于 2023-2-11 21:47
是的,如果是wps下面的表格,就不能用这个办法

嗯嗯我换了个电脑,没用wps了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-12 07:48:58 | 显示全部楼层
帅昊昊昊 发表于 2023-2-12 07:41
感谢大佬的代码,我再细细分析一下,就是不知道能不能帮忙拓展一下,这个提取的过程中按照我设定好的格式 ...

这个可以,我改一下代码就贴上来
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 22:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表