美文网首页Python学习资料整理
【校园杂工】Python脚本处理档案图片之三

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

作者: 少儿创客 | 来源:发表于2019-03-19 13:08 被阅读13次

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

    任务描述

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

    • 得到所有图片的缩略图
    • 把原图文件名和缩略图文件名对应的放到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,专门用来处理海量数据。

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/hjxgmqtx.html