鱼C论坛

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

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

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

import os
import shutil
import zipfile

from zipfile import ZipFile

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

if not os.path.exists(image_dir):
    os.mkdir(image_dir)
  
def extract_imag(excel_path, image_dir, name_format=""):
    image_path = os.path.join(image_dir, os.path.basename(excel_path).rsplit(".", 1)[0])
    if os.path.exists(image_path):
        shutil.rmtree(image_path)
    os.mkdir(image_path)
    try:
        with ZipFile(excel_path) as zf:      
            for file in zf.namelist():
                if file.startswith("xl/media/") and file != "xl/media/":
                    if name_format:
                        img_num, ext_name = os.path.splitext(os.path.basename(file)[5:])
                        path = os.path.join(image_path, name_format.format(img_num)+ext_name)
                    else:
                        path = os.path.join(image_path, os.path.basename(file))
                    with open(path, 'wb') as f:
                        f.write(zf.read(file))
        print(f'{excel_path} 提取图片成功!')
    except zipfile.BadZipFile:
        print(f'{excel_path} 不是一个xlsx格式的文件!')
    
    
for i in os.listdir(excel_dir):
    if i.endswith('.xlsx'):
        extract_imag(i, image_dir, name_format)
YU@V68[1{KK02H3CF(SX(55.png

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

import os
import shutil
import zipfile

from zipfile import ZipFile

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

if not os.path.exists(image_dir):
    os.mkdir(image_dir)
  
def extract_imag(excel_path, image_dir, name_format=""):
    image_path = os.path.join(image_dir, os.path.basename(excel_path).rsplit(".", 1)[0])
    if os.path.exists(image_path):
        shutil.rmtree(image_path)
    os.mkdir(image_path)
    try:
        with ZipFile(excel_path) as zf:      
            for file in zf.namelist():
                if file.startswith("xl/media/") and file != "xl/media/":
                    if name_format:
                        img_num, ext_name = os.path.splitext(os.path.basename(file)[5:])
                        path = os.path.join(image_path, name_format.format(img_num)+ext_name)
                    else:
                        path = os.path.join(image_path, os.path.basename(file))
                    with open(path, 'wb') as f:
                        f.write(zf.read(file))
        print(f'{excel_path} 提取图片成功!')
    except zipfile.BadZipFile:
        print(f'{excel_path} 不是一个xlsx格式的文件!')
    
    
for i in os.listdir(excel_dir):
    if i.endswith('.xlsx'):
        extract_imag(i, image_dir, name_format)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-10 16:47:53 From FishC Mobile | 显示全部楼层
把样品发出来啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

你是要这个文件吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

office的文档实际上是个zip包,使用zipfile解压,xl\media下面就是你要的图片,剩下的工作就简单了。
可以参见这个帖子里的代码:python在word文档里插入文件对象
想知道小甲鱼最近在做啥?请访问 -> 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'
希望大佬指点一下
import os
import zipfile
import os
from PIL import Image
import numpy as np 
path = r'C:/Users/Administrator/Desktop/'
count = 1
for file in os.listdir(path):
    new_file = file.replace(".xlsx",".zip")
    os.rename(os.path.join(path,file),os.path.join(path,new_file))
    count+=1
print('总共有'+str(count)+'个文件夹')
number = 0
craterDir = "C:/Users/Administrator/Desktop/"  # 存放zip文件的文件夹路径
saveDir = "C:/Users/Administrator/Desktop/"  # 存放图片的路径 
list_dir = os.listdir(craterDir) 
for i in range(len(list_dir)):
    if 'zip' not in list_dir[i]:
        list_dir[i] = ''
while '' in list_dir:
    list_dir.remove('')    
for zip_name in list_dir:
    print(zip_name)
    azip = zipfile.ZipFile(craterDir + zip_name)
    namelist = (azip.namelist())
 
    for idx in range(0,len(namelist)):
        if namelist[idx][:9] == 'xl/media/':#图片是在这个路径下
            img_name = saveDir + str(number)+'.jpg'
            f = azip.open(namelist[idx],'r')
            img = Image.open(f)
            img = img.convert("RGB")
            img.save(img_name,"JPEG")
            number += 1
azip.close()  #关闭文件,必须有,释放内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 14:05:35 | 显示全部楼层
我也不知道啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

看你要实现啥,这代码最后咋还涉及到格式转换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

就是第一个功能是将excel里的图片提取出来,然后按顺序给他命名,可以一次达成最好,不能分两次也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

这个并没啥难度,但是我没有源文件
我家电脑里装的是wps   wps不能像微软那样提取插入图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

if not os.path.exists(image_dir):
    os.mkdir(image_dir)
  
def extract_imag(excel_path, image_dir):
    image_path = os.path.join(image_dir, os.path.basename(excel_path).rsplit(".", 1)[0])
    os.mkdir(image_path)
    with ZipFile(excel_path) as zf:      
        for file in zf.namelist():
            if file.startswith("xl/media/") and file != "xl/media/":
                with open(os.path.join(image_path, os.path.basename(file)), 'wb') as f:
                    f.write(zf.read(file))
    
    
for i in os.listdir(excel_dir):
    if i.endswith('.xlsx'):
        extract_imag(i, image_dir)
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

意思是如果用wps打开excel就会提取不成功,那两个都有能成功吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

是不是有一个损坏的 xlsx 文件?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

我在代码中加了一个异常捕获:
import os
import shutil
import zipfile

from zipfile import ZipFile

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

if not os.path.exists(image_dir):
    os.mkdir(image_dir)
  
def extract_imag(excel_path, image_dir):
    image_path = os.path.join(image_dir, os.path.basename(excel_path).rsplit(".", 1)[0])
    if os.path.exists(image_path):
        shutil.rmtree(image_path)
    os.mkdir(image_path)
    try:
        with ZipFile(excel_path) as zf:      
            for file in zf.namelist():
                if file.startswith("xl/media/") and file != "xl/media/":
                    with open(os.path.join(image_path, os.path.basename(file)), 'wb') as f:
                        f.write(zf.read(file))
        print(f'{excel_path} 提取图片成功!')
    except zipfile.BadZipFile:
        print(f'{excel_path} 不是一个xlsx格式的文件!')
    
    
for i in os.listdir(excel_dir):
    if i.endswith('.xlsx'):
        extract_imag(i, image_dir)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

2023/02/11  21:29    <DIR>          .
2023/02/11  21:29    <DIR>          ..
2023/02/11  21:29           258,762 image1.jpeg
2023/02/11  21:29           238,690 image2.jpeg
2023/02/11  21:29           405,768 image3.jpeg
2023/02/11  21:29           572,757 image4.jpeg
               4 个文件      1,475,977 字节
               2 个目录 142,597,222,400 可用字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

是的,如果是wps下面的表格,就不能用这个办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

嗯嗯我换了个电脑,没用wps了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

这个可以,我改一下代码就贴上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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