Python学习(6) – 批量获取本地图片Sizes & Titles等信息保存到CSV
最近新弄了一个图片下载站,不想一张张图片上传文章加图片信息(图片尺寸、大小、名称等),所以想通过Python寻求一个一劳永逸的方法,当然本文提到的部分仅仅才实现获取信息,后面还有发布模块需要去解决。对于有几个月没有接触Python的新手来说,这次项目实践让我重新找回了一些学习Python的乐趣,毕竟实践出成果才是学习的动力。
踩坑指南
1、一开始找到的是Monster_H17的这篇代码,不过尝试本地运行多次都报错,后面换了小海怪的互联网这篇之后成功了,后面简单对比了一下,主要是正则获取图片Title那块前者有问题,导致没获取到内容;
2、小海怪这个代码虽然可以用不过到处的CSV文件里只有Title,后面也是通过各种教程拼凑进来才完整做到实现图片尺寸、大小等信息;
3、获取图片尺寸这个部分需要用到Pillow库
,直接在Pycharm
的settings里搜索安装一直不成功,在Termial
代码安装也一直报错,后面加了--default-timeout=100
,并且切换到全球网络才成功;
4、图片大小那部分本来打算用requests库
,后面发现这个库只能获取在线http上面的网页图片,后面幸亏找到了比较简单粗暴的方法,详见代码;
5、图片大小输出是纯数字,后面为了给它加上‘KB’字符也出现了错误,两个字符类型不一样不能合并,这个点纯粹是我这种新手才会踩的坑。
代码版块
# -*- coding: utf-8 -*-
# @Time : 2020-03-28 23:21
# @Author : Vookless
import os
import io
import csv
import requests
from PIL import Image
# 要读取的文件的根目录
root_path = r'C:\Users\XXX\PycharmProjects\l'
# 将所有目录下的文件信息放到列表中
def get_Write_file_infos(path):
# 文件信息列表
file_infos_list = []
# 遍历并写入文件信息
for root, dirnames, filenames in os.walk(path):
for filename in filenames:
file_infos = {}
dirname = root
path1 = os.path.join(root_path, filename)
filename1 = filename.split('.png')[0]
filename1 = filename1.replace("-", " ")
filename2 = r"https://example.com/wp-content/uploads/" + filename
img = Image.open(path1)
filesize = os.path.getsize(path1)
filesize = filesize / 1024
filesize = str(round(filesize, 2)) + 'KB'
file_infos["商品名称"] = filename1
file_infos["尺寸"] = img.size
file_infos["图片"] = filename2
file_infos["大小"] = filesize
# 将数据追加字典到列表中
file_infos_list.append(file_infos)
return file_infos_list
# 写入csv文件
def write_csv(file_infos_list):
with open('1.csv', 'a+', newline='') as csv_file:
csv_writer = csv.DictWriter(csv_file, fieldnames=['商品名称', '尺寸', '图片', '大小'])
csv_writer.writeheader()
for each in file_infos_list:
csv_writer.writerow(each)
# 主函数
def main():
# 调用获取文件信息的函数
file_infos_list = get_Write_file_infos(root_path)
# 执行写入程序
write_csv(file_infos_list)
# 主程序入口
if __name__ == '__main__':
main()
结束语
善用搜索引擎,真的太重要了,也许不能找到直接的解决方法,不过一定会有对你有帮助的教程。
P.S. 代码也许并不规范,新手代码,完全为了实现功能即可。