VookLess

Menu

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. 代码也许并不规范,新手代码,完全为了实现功能即可。

— 于 共写了1926个字
— 文内使用到的标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注