Python学习资料整理

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

2019-03-19  本文已影响13人  少儿创客

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

任务描述

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

图片处理

在前面两篇文章里,我们已经学习了用内置库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的核心步骤如下:

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,专门用来处理海量数据。

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

上一篇下一篇

猜你喜欢

热点阅读