【校园杂工】Python脚本处理档案图片之三

在一线有很多不必要或者重复的工作,为了把时间用到更有用的地方,我们可以编写程序实现任务的自动化。

任务描述

给定一个文件夹,其中有大量图片(没有子文件夹)需要做的是:

  • 得到所有图片的缩略图
  • 把原图文件名和缩略图文件名对应的放到excel表中

图片处理

在前面两篇文章里,我们已经学习了用内置库os提供的方法遍历该文件夹下所有的图片,并利用pillow模块提供的类和方法得到所有图片的缩略图,代码如下:

'''
遍历所有图片并生成每张图片的缩略图
'''

from PIL import Image
import os # 导入os模块

# 遍历所有图片
for file in os.listdir():
    # 判断图片格式是否为JPG
    if file.endswith('JPG'):
        # 打开图片
        img = Image.open(file)
        # 获得图片尺寸
        w, h  = img.size
        # 生成图片的缩略图
        # 宽和高都是原来的一半
        img.thumbnail((w//2, h//2))
        # 保存缩略图
        # 文件名也可以是序号
        img.save('thumbnail_' + file)

生成excel表格

接下来我们自动生成下图所示的excel文件:


excel文件

读写excel要用到xlrdxlwt库,这两个库的名字分别是xls read和xls write的缩写,这里我们主要用到xlwt文件。

安装xlwt库

我们用pip命令安装第三方库,打开命令行,输入pip install xlwt等一小会,xlwt库就可以安装完成,安装成功会有提示。

命令行界面

深入了解可以查看xlwt的文档https://xlwt.readthedocs.org/en/latest/

生成excel文件

在保专门托管Python第三方库的网站PyPI网站上https://pypi.org/project/xlwt/,给出了一段示例代码:

import xlwt
from datetime import datetime

style0 = xlwt.easyxf('font: name Times New Roman, color-index red, bold on',
    num_format_str='#,##0.00')
style1 = xlwt.easyxf(num_format_str='D-MMM-YY')

wb = xlwt.Workbook()
ws = wb.add_sheet('A Test Sheet')

ws.write(0, 0, 1234.56, style0)
ws.write(1, 0, datetime.now(), style1)
ws.write(2, 0, 1)
ws.write(2, 1, 1)
ws.write(2, 2, xlwt.Formula("A3+B3"))

wb.save('example.xls')

这是一个非常简洁优雅的例子,基本上xlwt如何使用讲解的非常清楚了,我们运行看下:

生成excel文件

可以看到图片文件夹下生成了一个excel文件,excel中的内容如下图所示:
excel内容

利用xlwt生成excel的核心步骤如下:

  • 导入xlwt
  • 使用xlwt库的workbook方法生成一个工作簿也就是excel文件
  • 使用工作簿的add_sheet方法添加一个工作表
  • 使用工作表的write方法写入数据

workbook方法

image.png

仔细观察xlwt的文档,发现workbook方法有一个encoding参数用来设置excel文件的编码,默认是ascii码,我们也可以指定为utf-8编码,如果excel中有中文。

write方法

使用write方法时,主要注意前两个参数,第一个参数r表示excel中单元格的行序号,第二个参数表示excel中单元格的列序号,注意与excel不同的是,这里的索引是从0开始的,而excel表示单元格序号是从1开始的

写入数据

我们在原来代码的基础上修改,在遍历文件之前,我们就应该导入xlwt库,生成工作簿,添加工作表,添加表头,保存文件,代码如下

from PIL import Image
import os # 导入os模块
import xlwt

# 新建工作簿,因为表头中文
# 编码改为utf-8
wb = xlwt.Workbook(encoding='utf-8')
# 添加工作表
ws =wb.add_sheet('amazing python')
# 生成表头
ws.write(0, 0, '序号')
ws.write(0, 1, '原文件名')
ws.write(0, 2, '缩略图文件名')

# # 遍历所有图片
# for file in os.listdir():
#     # 判断图片格式是否为JPG
#     if file.endswith('JPG'):
#         # 打开图片
#         img = Image.open(file)
#         # 获得图片尺寸
#         w, h  = img.size
#         # 生成图片的缩略图
#         # 宽和高都是原来的一半
#         img.thumbnail((w//2, h//2))
#         # 保存缩略图
#         # 文件名也可以是序号
#         img.save('thumbnail_' + file)

# 保存文件
ws.save('amazing-python.xls')

注意,我注释掉了中间负责遍历所有图片的代码,因为在测试xlwt库使用的过程中,我们不需要对图片进行处理,这也算是调试代码的一个小技巧把。

运行程序,可以看到图片文件夹下生成了excel文件:


amazing-python.xls

注意保存文件的方法save属于工作簿对象ws就像我们是在excel文件中的保存文件件一样。

写入真实数据

在写入真实数据的时候,我们需要有一个序号,这个序号,这个序号决定了我们向哪一行写入数据,这一样的序号是什么,因为每一行代表一张图片的数据,我们可以简单的定义一个变量,初始化为1,然后在for循环中使用就可以了。

'''
遍历所有图片并生成每张图片的缩略图
'''

from PIL import Image
import os # 导入os模块
import xlwt

# 新建工作簿,因为表头中文
# 编码改为utf-8
wb = xlwt.Workbook(encoding='utf-8')
# 添加工作表
ws =wb.add_sheet('amazing python')
# 生成表头
ws.write(0, 0, '序号')
ws.write(0, 1, '原文件名')
ws.write(0, 2, '缩略图文件名')

# 因为已经写入了表头
# 所以序号从1开始
id = 1
for file in os.listdir():
    if file.endswith('JPG'):
        img = Image.open(file)
        w, h  = img.size
        img.thumbnail((w//2, h//2))
        thumb_name = 'thumbnail_' + file
        # 填充数据
        # 第1列:序号       
        ws.write(id, 0, id)
        # 第2列:原文件名
        ws.write(id, 1, file)
        # 第3列:缩略图文件名
        ws.write(id, 2, thumb_name)
        # 注意id遍历自增
        id += 1
        img.save(thumb_name)

# 保存文件
wb.save('amazing-python.xls')

我们先来看文件夹最开始的状图,如下图:


初始状态

文件夹中只有main.py文件和所有的图片(之前生成的excel文件和缩略图删除了),运行程序,结果如下:


运行结果

打开生成的excel


生成的excel文件

好了,大功告成!

可以看到,完成整个任务的代码寥寥几行,并且因为Python拥有大量好用的第三库,我们不需要自己实现太多的功能,而且代码逻辑清晰,容易理解,Python不愧为可以执行的伪代码,所以学会Python,不光是为了教学,还可以大大提高工作效率,这样就有更多的时间养生了,毕竟活得长比什么都重要

拓展

excel美化

第三方库xlwt提供了设置单元格样式的方法,感兴趣的可以自己翻文档

关于数组遍历

遍历数组的时候,可以通过特殊方法同事得到索引和列表项的,代码会更加优雅。

'''
遍历所有图片并生成每张图片的缩略图
'''

from PIL import Image
import os # 导入os模块
import xlwt

# 新建工作簿,因为表头中文
# 编码改为utf-8
wb = xlwt.Workbook(encoding='utf-8')
# 添加工作表
ws =wb.add_sheet('amazing python')
# 生成表头
ws.write(0, 0, '序号')
ws.write(0, 1, '原文件名')
ws.write(0, 2, '缩略图文件名')

for id, file in enumerate(os.listdir()):
    if file.endswith('JPG'):
        img = Image.open(file)
        w, h  = img.size
        img.thumbnail((w//2, h//2))
        thumb_name = 'thumbnail_' + file
        # 填充数据
        # 第1列:序号       
        ws.write(id + 1, 0, id)
        # 第2列:原文件名
        ws.write(id + 1, 1, file)
        # 第3列:缩略图文件名
        ws.write(id + 1, 2, thumb_name)
        img.save(thumb_name)

# 保存文件
wb.save('amazing-python.xls')

其中写入内容的时候write方法第1个参数加1了,因为对于Python中的列表来说,索引是从1开始的,而我们序号从1开始,所以就要加1了。

真实任务

生成的excel文件

档案工作要求

比较上面的两个excel表,虽然有差异,但是要生成

参考资料

http://www.python-excel.org/ 这个网站有跟处理excel相关的常用Python库

xlwings

用Python替代VBA给excel编程的xlwings

xlwings

网址https://www.xlwings.org/

pandas

更加专业的pandas,专门用来处理海量数据。

如果觉得有帮助可以点正在看,点赞或者转发分享

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,169评论 0 9
  • python 也是很值得学习的一门工具。学好python和R。 1环境管理 管理 Python 版本和环境的工具 ...
    Liam_ml阅读 4,798评论 1 51
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,961评论 1 3
  • 关键词:敏捷开发、po po是product owner,是产品负责人,熟悉整个业务相关的流程、逻辑、设置等方面的...
    王诺诺是我阅读 867评论 0 0
  • 三段故事,三段人生,也是三种爱情。第一段,太完美;第二段,太无奈;第三段,太伤感…… 【一】 第一段故事,太过奢华...
    昕曦阅读 513评论 0 3