(翻译)30天学习Python👨‍💻第二十一天——基础脚本

921 阅读6分钟

30天学习Python👨‍💻第二十一天——基础脚本

今天我探索了Python脚本编写的基本知识。脚本基本意味着编写包含命令集的程序,以命令行或者交互shell的方式运行,执行一些有些的任务并使它们自动化。有许多事情可以用Python脚本自动化执行,比如处理像PDF、图片、excel、CSV等不同类型的文件,发送邮件,创建像推特机器人那样的机器人等等很多。作为这次挑战的一部分,我决定学习脚本的基础知识,能够让我理解这些概念,并且在未来能够进行深入的探索。我今天要做的是找出使用Python脚本处理图片和PDF文件的基本技术。

图像处理

图片处理简单来说就是使用一种使用程序对图片执行一些操作的方法或技术,用来对图片进行美化或者提取图片信息。在Python里有很多受欢迎的库可以用来处理图片,比如

我尝试使用了Pillow,它是Python图像处理库(PIL)的一个分支,它已经不再维护并且不支持最新的Python版本。但是使用Pillow的推荐程度要超过PIL。

Pillow的下载以及基本使用方法可以在这个文档中找到。

pillow.readthedocs.io/en/stable/i…

Pillow可以在命令行使用命令pip install Pillow下载(具体操作系统命令请查看文档)

【译者注:Python3可能需要使用命令pip3 install Pillow

是时候创建一些图片处理脚本了。我首先要创建的是一个基本的图片转换器,它可以把一个文件夹中所有JPEG格式的图片转换成PNG格式,并把它们存储在另一个文件夹中。我从 unsplash.com上下载了一些JPEG图片,并把它们存在了imgges文件夹中。脚本需要读取所有的JPEG图片,将它们全部转换为PNG,并存在一个新的generated文件夹中。

这个脚本文件我命名为了image_convertor.py这是这个项目的GitHub仓库

因为原始图片尺寸太大了,我首先想到的是缩小它的尺寸,然后再进行转换,以此来提高脚本的执行效率。

image_converter.py

import os
from PIL import Image

# 从图片资源文件夹中获取所有文件
dirname = 'images'
output_dirname = 'generated'
images_list = os.listdir(dirname)

# 检查文件夹是否存在,如果不存在则新建
if not os.path.exists(output_dirname):
    os.makedirs(output_dirname)

for image in images_list:
    # 把文件夹名字的名称和格式分离出来
    name, format = os.path.splitext(image)

    original = Image.open(f'{dirname}\{image}')

    # 将图像调整为标准大小,减少文件大小
    size = 1000,1000
    # 缩略图保持长宽比
    original.thumbnail(size) 


    # 保存图片为PNG格式
    original.save(f'{output_dirname}\{name}.png')

脚本可以在控制台通过python image_converter.py运行。它可以自动的转化图片并放到一个新生成的文件夹中。

我创建的第二个脚本是一个灰度图片转换器,能够将所有的图片转换成黑白图片。Pillow的很多过滤器可以应用在图片上,灰度图片只是其中的一个。

grayscale_converter.py

import os
from PIL import Image, ImageFilter

# 从图片资源文件夹中获取所有文件
dirname = 'images'
output_dirname = 'greyscale'
images_list = os.listdir(dirname)

# 检查文件夹是否存在,如果不存在则新建
if not os.path.exists(output_dirname):
    os.makedirs(output_dirname)

for image in images_list:
    # 把文件夹名字的名称和格式分离出来
    name, format = os.path.splitext(image)

    original = Image.open(f'{dirname}\{image}')

    # 将图像调整为标准大小,减少文件大小
    size = 1000, 1000
    # 缩略图保持长宽比
    original.thumbnail(size)

    # 将图片转换为灰度图片
    grayscale_image = original.convert('L')  # L模式的意思是灰度
    grayscale_image.save(f'{output_dirname}\{image}')

最后,我创建了另一个图片处理脚本,将一个logo应用在所有的图片上。这使用到了图片合成技术。如果我们需要使用品牌图片,这会是非常有用的。我把一个logo.png图片文件添加到了根目录。

brand_stamp.py

import os
from PIL import Image, ImageFilter

# 从图片资源文件夹中获取所有文件
dirname = 'images'
output_dirname = 'branded'
images_list = os.listdir(dirname)
logo = Image.open('logo.png')

# 检查文件夹是否存在,如果不存在则新建
if not os.path.exists(output_dirname):
    os.makedirs(output_dirname)

for image in images_list:
    # 把文件夹名字的名称和格式分离出来
    name, format = os.path.splitext(image)

    original = Image.open(f'{dirname}\{image}')

    # 将图像调整为标准大小,减少文件大小
    size = 1000, 1000
    # 缩略图保持长宽比
    original.thumbnail(size)

    # 创建图片的副本
    image_copy = original.copy()
    # 获得logo的放置位置

    position = ((image_copy.width - logo.width),
                (image_copy.height - logo.height))
    # 第三个参数能够让它变得透明
    image_copy.paste(logo, position, logo)
    image_copy.save(f'{output_dirname}\{name}.png')

这真的非常棒!但这只是图像处理的皮毛。我认为这是一个很好的起点,未来创建项目时可以再深入探索。

下面有一个我发现的Python中关于图像处理的有趣资源

PDF处理

处理摆弄图像,我还探索了PDF文件,并且基于一些实用的案例探索了处理PDF文件的基础知识。PDF时使用最广泛的文件格式之一,可以存储各种各样类型的数据。

我使用的库是PyPDF2 pypi.org/project/PyP… ,这是我在PyPI上找到的最受欢迎的库。这个库可以使用pip进行下载,pip install PyPDF2

我给pdf文件夹添加了一个简单的PDF文件

我创建的第一个脚本文件是提供PDF文件的主要信息,比如它的作者、页数、主题、标题等等。

info_extractor.py

from PyPDF2 import PdfFileReader

def extract_information(pdf_path):
    with open(pdf_path, 'rb') as f:
        pdf = PdfFileReader(f)
        information = pdf.getDocumentInfo()
        number_of_pages = pdf.getNumPages()

    txt = f"""
    Information about {pdf_path}: 

    Author: {information.author}
    Creator: {information.creator}
    Producer: {information.producer}
    Subject: {information.subject}
    Title: {information.title}
    Number of pages: {number_of_pages}
    """

    print(txt)
    return information

if __name__ == '__main__':
    path = 'pdfs/sample1.pdf'
    extract_information(path)

这个脚本可以使用python info_extractor.py运行。它应该成功的打印出所需要的关于这个PDF文件的所有信息。

最后,我创建了另一个脚本给所有的pdf文件添加水印。为此,我创建了另一个空白的PDF文件,只有logo作为水印。现在可以将其与要处理的PDF文件合并。创建带水印的PDF是非常常见的一个需求,并且自动化这个任务是非常有用的。

pdf_watermarker.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, output, watermark):
    watermark_obj = PdfFileReader(watermark)
    watermark_page = watermark_obj.getPage(0)

    pdf_reader = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()

    # Watermark all the pages
    for page in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page)
        page.mergePage(watermark_page)
        pdf_writer.addPage(page)

    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    create_watermark(
        input_pdf='pdfs/sample1.pdf', 
        output='pdfs/watermarked_sample.pdf',
        watermark='pdfs/watermark.pdf')

运行python pdf_watermarker.py,它应该生成一个带水印的PDF文件。

有很多事情可以用PDF完成。但是,我只是想要通过基础的知识熟悉这个过程。我给了一些非常好的深入PDF处理的资料链接。

所有相关的代码都可以在这个Github仓库找到。

这就是今天的全部了。

原文链接

30 Days of Python 👨‍💻 - Day 21 - Scripting Basics