大家好,我是小五🚀
前面我们使用python批量将Excel中的url链接转成图片,结果读者后来跟我反馈又遇到了一些问题。
于是乎,干脆对前几天的代码升级一波。
需求简介
具体原始数据和期望结果如下图所示:
但这位读者朋友又遇到了一个问题👇
解决当url为空时代码停止运行的问题
将图片保存到新增文件夹,大概有1.4W张图片,后续删图片有难度
第一个问题呢,只需加个判断语句就可以。至于将图片保存到新增文件夹,修改保存路径就可以解决了。
但是1.4w张图片下载到本地确实太麻烦了。经过@小明哥 的指导,其实我们下载图片到内存,完全不用再把图片下载到本地啦。
操作代码
本次升级除了解决被提出的两个问题,还有小五自己觉得不满意的地方。
等比例缩放图片
比如图片变形问题:
从上图可以看到,之前代码运行后会给图片设置了固定尺寸72。但有些图片本身并不是正方形的,这就会导致插入后图片变形。
所以在@小明哥 的指导下,又构造了一个函数用来等比例缩放图片。
def img_resize(width, height):
if width > height:
height = height*72//width
width = 72
else:
width = width*72//height
height = 72
return width, height
解决了这个问题,再说说如何将图片下载到内存。
下载到内存
StringIO
经常被用来作字符串的缓存,因为StringIO的一些接口和文件操作是一致的,也就是说同样的代码,可以同时当成文件操作或者StringIO操作。
StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO[1]。我们这里对它的具体用法如下:
import io
res = requests.get(url)
img = Image(io.BytesIO(res.content))
我们还可以顺便查看图片的格式
print(img.format) # 获取图片的格式
其余代码
为了方便大家查看,关键代码都进行了注释。如果对某些操作处理不理解,可以查看上一篇文章《批量将Excel中的url链接转成图片》。
for cell, in ws["B2:B6"]:
url = cell.value
print(url)
if url == None:
continue
# 删除超链接
cell.hyperlink = None
# 删除内容
cell.value = ""
# 设置行高
ws.row_dimensions[cell.row].height = 54
# 下载图片到内存
res = requests.get(url)
img = Image(io.BytesIO(res.content))
# 等比例缩放图片
width, height = img_resize(img.width, img.height)
img.width = width
img.height = height
# 添加图片到指定单元格
ws.add_image(img, f'B{cell.row}')
wb.save('结果文件.xlsx')
运行结果:
成功完成需求🚀
参考资料
[1]
Python3-StringIO和BytesIO的总结: https://blog.csdn.net/yang\_bingo/article/details/84066217
本文转转自微信公众号凹凸数据原创https://mp.weixin.qq.com/s/Y08VWB2KFnxpAl_9mw9uSQ,可扫描二维码进行关注: 如有侵权,请联系删除。