文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python怎么读取excel中的图片功能

2023-06-29 01:31

关注

这篇文章主要介绍“Python怎么读取excel中的图片功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么读取excel中的图片功能”文章能帮助大家解决问题。

一、读取excel文件

我们先来看看如何读取excel文件,读取excel文件的方式很多。这里选择openpyxl模块,安装语句如下:

pip install openpyxl

我们还需要用到一些其它模块,具体如下:

pip install pyzbarpip install pillowpip install numpy

下面我们就可以开始操作了。

在Excel中,有工作簿、表、单元等。这里简单说一下,工作簿就是一个excel文件,表的话就是我们excel左下角切换的sheet1、sheet2,单元就是一个格子。下面我们来读取一个excel文件:

from openpyxl import load_workbook# 加载excelwb = load_workbook("111.xlsx")# 切换到第一张表ws = wb[wb.sheetnames[0]]# 获取A3单元cell = ws['A3']# 输出A3单元的值print(cell.value)

二、读取excel中的图片

读取excel中的图片有多种方式,本文会分享两种方式。

(1)使用zipfile模块

excel本身是一个压缩文件,我们把excel的后缀改成zip后,手动解压就会看到在xl/media目录下有一些图片文件,这些图片就是excel种插入的图片。因此我们就可以通过解压的方式读取excel种的图片,具体代码如下:

import osfrom zipfile import ZipFile# 解压目录unzip_path = "./unzip"if not os.path.exists(unzip_path):    os.mkdir(unzip_path)with ZipFile("111.xlsx") as f:    for file in f.namelist():        # 解压图片部分的文件        if file.startswith("xl/media"):            f.extract(file, path=unzip_path)

(2)使用openpyxl读取

上面的操作可以获取excel中的图片,但是有个缺点。就是我们不知道哪个图片来自哪个单元,在有些情况下知道图片来自哪个单元是很有比较的。下面我们就来解决这个问题:

from openpyxl import load_workbookwb = load_workbook("111.xlsx")ws = wb[wb.sheetnames[0]]# 遍历表中所有托for image in ws._images:    print(image)

我们先读取了一个表,然后调用_images获取表中的所有图片。但是这个图片我们还不能操作,具体对图片的操作我们下一节再看。我们先看看怎么知道图片来自哪个单元,我们可以输出图片的anchor._from:

from openpyxl import load_workbookwb = load_workbook("111.xlsx")ws = wb[wb.sheetnames[0]]for image in ws._images:    # 输出图片的位置信息    print(image.anchor._from)

具体输入内容如下:

<openpyxl.drawing.spreadsheet_drawing.AnchorMarker object>Parameters:col=0, colOff=1, row=0, rowOff=1

其中col表示行号,row表示列号。根据这些信息,我们就可以知道图片的单元了。比如col=0,row=0,表示的应该是A1单元。如果col=1,row=1,表示的应该是B2单元。

三、对读取的图片进行处理

对图片处理的操作有很多,这里要看具体需要。这里我分享一下把excel中图片转换成pillow图片和ndarray对象的操作。转换后,我们就可以用numpy和pillow对图片进行各种操作。

import numpy as npfrom PIL import Imagefrom openpyxl import load_workbookwb = load_workbook("111.xlsx")ws = wb[wb.sheetnames[0]]for image in ws._images:    # 将图片转换成Pillow中的图片对象    img = Image.open(image.ref).convert("RGB")    # 将Pillow中的图片对象转换成ndarray数组    img = np.array(img)

如果我们excel中的图片是二维码,我们就可以进行下面的操作:

import numpy as npfrom PIL import Imagefrom pyzbar import pyzbarfrom openpyxl import load_workbookwb = load_workbook("111.xlsx")ws = wb[wb.sheetnames[0]]for image in ws._images:    # 转换成容易操作的图片对象    img = Image.open(image.ref).convert("RGB")    img = np.array(img)        # 解析二维码    data = pyzbar.decode(img)    if data:        text = data[0].data.decode('utf-8')        print(text)    else:        print("未识别到内容")

补充

除了以上的方法,还可以通过以下操作实现:

将待读取的excel文件后缀名改成zip,变成压缩文件。

再解压这个文件。

在解压后的文件夹中,就有excel中的图片。

这样读excel中的图片,就变成了读文件夹中的图片了,和普通文件一样,可以做各种处理。

具体实现代码

 ''' File Name:  readexcelimg Author:   tim Date:    2018/7/26 19:52 Description: 读取excel中的图片,打印图片路径   先将excel转换成zip包,解压zip包,包下面有文件夹存放了图片,读取这个图片 '''  import os import zipfile # 判断是否是文件和判断文件是否存在 def isfile_exist(file_path):   if not os.path.isfile(file_path):     print("It's not a file or no such file exist ! %s" % file_path)     return False   else:     return True # 修改指定目录下的文件类型名,将excel后缀名修改为.zip def change_file_name(file_path, new_type='.zip'):   if not isfile_exist(file_path):     return ''   extend = os.path.splitext(file_path)[1] # 获取文件拓展名   if extend != '.xlsx' and extend != '.xls':     print("It's not a excel file! %s" % file_path)     return False   file_name = os.path.basename(file_path) # 获取文件名   new_name = str(file_name.split('.')[0]) + new_type # 新的文件名,命名为:xxx.zip   dir_path = os.path.dirname(file_path) # 获取文件所在目录   new_path = os.path.join(dir_path, new_name) # 新的文件路径   if os.path.exists(new_path):     os.remove(new_path)   os.rename(file_path, new_path) # 保存新文件,旧文件会替换掉   return new_path # 返回新的文件路径,压缩包 # 解压文件 def unzip_file(zipfile_path):   if not isfile_exist(zipfile_path):     return False   if os.path.splitext(zipfile_path)[1] != '.zip':     print("It's not a zip file! %s" % zipfile_path)     return False   file_zip = zipfile.ZipFile(zipfile_path, 'r')   file_name = os.path.basename(zipfile_path) # 获取文件名   zipdir = os.path.join(os.path.dirname(zipfile_path), str(file_name.split('.')[0])) # 获取文件所在目录   for files in file_zip.namelist():     file_zip.extract(files, os.path.join(zipfile_path, zipdir)) # 解压到指定文件目录   file_zip.close()   return True # 读取解压后的文件夹,打印图片路径 def read_img(zipfile_path):   if not isfile_exist(zipfile_path):     return False   dir_path = os.path.dirname(zipfile_path) # 获取文件所在目录   file_name = os.path.basename(zipfile_path) # 获取文件名   pic_dir = 'xl' + os.sep + 'media' # excel变成压缩包后,再解压,图片在media目录   pic_path = os.path.join(dir_path, str(file_name.split('.')[0]), pic_dir)   file_list = os.listdir(pic_path)   for file in file_list:     filepath = os.path.join(pic_path, file)     print(filepath) # 组合各个函数 def compenent(excel_file_path):   zip_file_path = change_file_name(excel_file_path)   if zip_file_path != '':     if unzip_file(zip_file_path):       read_img(zip_file_path) # main if __name__ == '__main__':   compenent('/Users/Desktop/test/people.xlsx')

关于“Python怎么读取excel中的图片功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯