在一线有很多不必要或者重复的工作,为了把时间用到更有用的地方,我们可以编写程序实现任务的自动化。
任务描述
给定一个文件夹,其中有大量图片(没有子文件夹)需要做的是:
- 得到所有图片的缩略图
- 把原图文件名和缩略图文件名对应的放到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要用到xlrd
和xlwt
库,这两个库的名字分别是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中的内容如下图所示:
利用xlwt生成excel的核心步骤如下:
- 导入
xlwt
库 - 使用
xlwt
库的workbook
方法生成一个工作簿也就是excel文件 - 使用工作簿的
add_sheet
方法添加一个工作表 - 使用工作表的
write
方法写入数据
workbook方法
仔细观察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文件:
注意保存文件的方法
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
好了,大功告成!
可以看到,完成整个任务的代码寥寥几行,并且因为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表,虽然有差异,但是要生成
参考资料
http://www.python-excel.org/ 这个网站有跟处理excel相关的常用Python库
xlwings
用Python替代VBA给excel编程的xlwings
网址 https://www.xlwings.org/
pandas
更加专业的pandas,专门用来处理海量数据。