鱼C论坛

 找回密码
 立即注册
查看: 5567|回复: 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:54:48 | 显示全部楼层

你是要这个文件吗
小甲鱼最新课程 -> 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 17:53:38 | 显示全部楼层
wp231957 发表于 2023-2-11 17:20
看你要实现啥,这代码最后咋还涉及到格式转换

就是第一个功能是将excel里的图片提取出来,然后按顺序给他命名,可以一次达成最好,不能分两次也可以
小甲鱼最新课程 -> 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-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 14:16:28 | 显示全部楼层
isdkz 发表于 2023-2-12 07:48
这个可以,我改一下代码就贴上来

谢谢大哥,很有帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-23 10:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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