帅昊昊昊 发表于 2023-2-10 16:45:01

excel提取图片并按照设定的顺序命名

提取图中文件的照片然后重新命名,我这个没有头绪不知道怎么写,求大佬指点

isdkz 发表于 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))
    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))
                        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)

wp231957 发表于 2023-2-10 16:47:53

把样品发出来啊

帅昊昊昊 发表于 2023-2-10 16:54:48

wp231957 发表于 2023-2-10 16:47
把样品发出来啊

你是要这个文件吗

txxcat 发表于 2023-2-10 20:21:56

本帖最后由 txxcat 于 2023-2-11 08:13 编辑

office的文档实际上是个zip包,使用zipfile解压,xl\media下面就是你要的图片,剩下的工作就简单了。
可以参见这个帖子里的代码:python在word文档里插入文件对象

帅昊昊昊 发表于 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:
      list_dir = ''
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[:9] == 'xl/media/':#图片是在这个路径下
            img_name = saveDir + str(number)+'.jpg'
            f = azip.open(namelist,'r')
            img = Image.open(f)
            img = img.convert("RGB")
            img.save(img_name,"JPEG")
            number += 1
azip.close()#关闭文件,必须有,释放内存

周泽宇 发表于 2023-2-11 14:05:35

我也不知道啊

wp231957 发表于 2023-2-11 17:20:04

帅昊昊昊 发表于 2023-2-11 08:32
你这个是写入,读取的话怎么搞,昨天我网上找了一下类似情况的,也是用zipfile压缩后,去xl\media下找图 ...

看你要实现啥,这代码最后咋还涉及到格式转换

帅昊昊昊 发表于 2023-2-11 17:53:38

wp231957 发表于 2023-2-11 17:20
看你要实现啥,这代码最后咋还涉及到格式转换

就是第一个功能是将excel里的图片提取出来,然后按顺序给他命名,可以一次达成最好,不能分两次也可以

wp231957 发表于 2023-2-11 18:07:22

帅昊昊昊 发表于 2023-2-11 17:53
就是第一个功能是将excel里的图片提取出来,然后按顺序给他命名,可以一次达成最好,不能分两次也可以

这个并没啥难度,但是我没有源文件
我家电脑里装的是wps   wps不能像微软那样提取插入图片

isdkz 发表于 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))
    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)

帅昊昊昊 发表于 2023-2-11 20:32:51

isdkz 发表于 2023-2-11 19:00


大佬,这个创建文件夹成功了,但是提取照片失败了,错误原因如下,我的判断他说,这个文件不是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

帅昊昊昊 发表于 2023-2-11 20:33:28

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

意思是如果用wps打开excel就会提取不成功,那两个都有能成功吗

isdkz 发表于 2023-2-11 20:37:56

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

是不是有一个损坏的 xlsx 文件?

isdkz 发表于 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))
    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)

chinajz 发表于 2023-2-11 21:32:57

office2016测试10楼和14楼代码都没问题。
C:\Users\Administrator\Desktop\Python\execl读取图片\image\test 的目录

2023/02/1121:29    <DIR>          .
2023/02/1121:29    <DIR>          ..
2023/02/1121:29         258,762 image1.jpeg
2023/02/1121:29         238,690 image2.jpeg
2023/02/1121:29         405,768 image3.jpeg
2023/02/1121:29         572,757 image4.jpeg
               4 个文件      1,475,977 字节
               2 个目录 142,597,222,400 可用字节

wp231957 发表于 2023-2-11 21:47:05

帅昊昊昊 发表于 2023-2-11 20:33
意思是如果用wps打开excel就会提取不成功,那两个都有能成功吗

是的,如果是wps下面的表格,就不能用这个办法

帅昊昊昊 发表于 2023-2-12 07:41:15

isdkz 发表于 2023-2-11 21:10
这个代码只能用于提取 xlsx 格式的表格的图片,应该是你那个目录存在不是 xlsx 格式却以 xlsx 为扩展名的 ...

感谢大佬的代码,我再细细分析一下,就是不知道能不能帮忙拓展一下,这个提取的过程中按照我设定好的格式去提取,比如第一张命名为第1盒芯样

帅昊昊昊 发表于 2023-2-12 07:42:56

wp231957 发表于 2023-2-11 21:47
是的,如果是wps下面的表格,就不能用这个办法

嗯嗯我换了个电脑,没用wps了

isdkz 发表于 2023-2-12 07:48:58

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

这个可以,我改一下代码就贴上来
页: [1] 2
查看完整版本: excel提取图片并按照设定的顺序命名