Python小功能实现(链接下载图品并存储到EXCEL中)

devtools/2024/11/14 12:40:19/
python">import os
import requests
from openpyxl import Workbook
from openpyxl.drawing.image import Image
from concurrent.futures import ThreadPoolExecutor# 图片链接列表
image_urls = ["https://uploads/file/20230205/f85Lpcv8PXrLAdmNUDE1Hh6xqkp0NHi2gSXeqyOb.png","https://uploads/file/20230205/geG4FOpthrsUX0LkmWvDH2veFtw6yj8JLDMYBaQ1.png","https://uploads/file/20230205/mjVAx4jsbke6uj0e2Qz66f8KDceL1P5tanKQkNoy.png"
]
output_dir = "C:/Users/win-10/Desktop/发票图片/"  # 指定Excel文件的输出目录
# 保存图片的本地目录
save_folder = "C:/Users/win-10/Desktop/发票图片/downloaded_images/"
# Excel文件名
excel_filename = "images_with_links.xlsx"
# 最大下载尝试次数
max_download_attempts = 3def download_image(url, filename, attempts=0):"""下载图片到指定文件名:param url: 图片的URL链接:param filename: 保存图片的本地文件名:param attempts: 当前下载尝试次数,默认为0:return: 成功保存的文件名,下载失败返回None"""try:response = requests.get(url, stream=True)if response.status_code == 200:with open(filename, 'wb') as f:for chunk in response.iter_content(1024):f.write(chunk)return url, filename  # 返回包含URL和文件名的元组else:raise Exception(f"HTTP错误码:{response.status_code}")except Exception as e:if attempts < max_download_attempts - 1:print(f"下载尝试失败:{e},重试...")return download_image(url, filename, attempts + 1)else:print(f"下载失败:{url}{e}")return url, None  # 返回包含URL和None(表示下载失败)的元组def create_excel_file(image_data, output_dir, excel_filename):"""创建Excel文件并添加图片信息:param image_data: 包含图片URL和本地路径的元组列表:param output_dir: 目标Excel文件的输出目录:param excel_filename: Excel文件名(不含目录路径)"""global cm_to_px_ratioworkbook = Workbook()sheet = workbook.activefor idx, (img_url, img_path) in enumerate(image_data, start=1):sheet[f"A{idx}"] = img_urlimg = Image(img_path[1])  # 使用元组的第二个元素(文件名)# 设置图片大小为6厘米 × 6厘米cm_to_px_ratio = 20  # 假设1厘米等于96像素img.width = 6 * cm_to_px_ratioimg.height = 6 * cm_to_px_ratio# 将图片放置在与链接同一行的第二列(B列)img.anchor = f"B{idx}"img.left = idx  # 或者 img.left = idx * 250  如果需要图片间有一定的间距img.top = idxsheet.add_image(img)# 调整列宽以适应内容sheet.column_dimensions['A'].width = 6 * cm_to_px_ratiosheet.column_dimensions['B'].width = 6 * cm_to_px_ratiosheet.row_dimensions[idx].height = 6 * cm_to_px_ratioexcel_full_path = os.path.join(output_dir, excel_filename)workbook.save(excel_full_path)print(f"图片及其链接已保存至Excel文件:{excel_full_path}")if __name__ == "__main__":if not image_urls:print("图片链接列表为空,程序退出。")exit(1)# 创建保存目录(如果不存在)if not os.path.exists(save_folder):os.makedirs(save_folder)with ThreadPoolExecutor(max_workers=5) as executor:# 使用线程池并发下载图片image_futures = [executor.submit(download_image, url, os.path.join(save_folder, f"image{idx}.{url.split('.')[-1]}")) foridx, url in enumerate(image_urls, start=1)]# 收集下载结果image_data = [(url, future.result()) for idx, (url, future) inenumerate(zip(image_urls, image_futures), start=1)]# 使用下载的图片信息创建Excel文件create_excel_file(image_data, output_dir, excel_filename)

在这里插入图片描述


http://www.ppmy.cn/devtools/22161.html

相关文章

Unity 异常 bug

OverlapBoxNonAlloc 使用bug 环境&#xff1a; Unity2021.3.15 在测试场景中使用 OverlapBoxNonAlloc 测试检测没有问题 但是到了真实应用场景&#xff0c;使用 OverlapBoxNonAlloc 检测移动中的小怪 小怪碰撞体为&#xff1a;带有 Rigidbody 的Circle Collider 2D 就会出现异…

【数据库】MySQL数据表记录改操作

修改语句&#xff1a;作用修改记录里的部分值 一、修改单表记录 语法&#xff1a; update 表名 set 字段名1新的值,字段名2新值,.......where 条件; 案例&#xff1a;修改学生表中姓王的同学的班级都改为11601 UPDATE students SET class11601 WHERE sname LIKE 王%; 二、…

边界检查C

空指针判断&#xff1a; 在使用指针之前&#xff0c;先判断指针是否为空指针&#xff08;即指针是否为NULL&#xff09;。可以使用if语句或者三目运算符进行判断&#xff0c;例如&#xff1a; int *ptr NULL; if (ptr NULL) {printf("ptr is a null pointer\n"); …

C#基础|StringBuilder字符串如何高效处理。

哈喽&#xff0c;你好&#xff0c;我是雷工。 字符串处理在C#程序开发中是使用频率比较高的&#xff0c;但常规的字符串处理方式对内存占用比较多&#xff0c;为了优化内存&#xff0c;减少不必要的内存浪费&#xff0c;引入了StringBuilder类。 下面学习下StringBuilder类的使…

基于SpringBoot+Vue乡村养老服务管理系统

项目介绍&#xff1a; 使用旧方法对乡村养老服务管理系统登录的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在乡村养老服务管理系统登录的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误…

Java中的模版方法设计模式详解

Java中的模版方法设计模式详解 在Java编程中&#xff0c;设计模式是一种解决常见问题的最佳实践。其中&#xff0c;模版方法设计模式是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。这样可以使子类在不改变算法结构的情况…

mongodb 安装问题

1. mongodb启动时显示 Illegal instruction (core dumped) mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集 2.启动时报错 ERROR: child process failed, exited with 1 通过指令 bin/mongod --repair 或 ./bin/mongod -f configs/mongodb.conf --repair查看报错信息…

应用实战 | 别踩白块小游戏,邀请大家来PK挑战~

“踩白块会输”是一个简单的微信小程序游戏&#xff0c;灵感来自当年火热的别踩白块游戏&#xff0c;程序内分成三个模块&#xff1a;手残模式、经典模式和极速模式&#xff0c;分别对应由易到难的三种玩法&#xff0c;可以查看游戏排名。动画效果采用JS实现&#xff0c;小程序…