手把手教你用 Python 编写 3 个实用脚本,早掌握早下班~

脚本写的好,下班下得早!程序员一大特长就是用程序实现自动化脚本,让枯燥、重复的工作自动执行~

能否写出高效实用的脚本代码,直接影响着一个程序员的幸福生活 [下班时间]。今天我们就手把手教你用 Python 写 3 个实用脚本,分别是:

  • 将 Markdown 文本转换为 HTML 文本的脚本文件

  • 批量检测文本文件的编码信息,并批量转换到任意编码,再无乱码之忧

  • 利用 md5 和 sha1 进行文件检验

教程出自实验楼课程「使用 Python3 编写系列实用脚本」,目前正在限免中,课程如下,欢迎打开电脑同步操作实验:

https://www.shiyanlou.com/courses/580

教程如下:

Markdown 文本转HTML

一、实验简介

本节实验我们学习使用 Python3 编写一个将 Markdown 文本转换为 HTML 文本的脚本文件,这个脚本可以自定义 HTML 的 CSS 样式(默认没有样式),可以自定义输出目录(默认为 Markdown 文件所在目录),并且提供使用说明。

知识点
  • Python3 基础语法

  • os 模块处理文件名和路径

  • getopt 模块解析命令行参数

  • markdown 模块转换文本格式

  • BeautifulSoup4 模块格式化 HTML

效果展示

实验所需模块及其版本
  • python 3.5.2

  • markdown 3.3.1

  • beautifulsoup4 4.8.1

  • html5lib 1.0.1

适合人群

面向于有 Python3 语法基础、有 HTML 基础的人群,适合 Python3 的进阶学习。

代码获取

可以在实验环境中使用如下命令下载完整代码:

$ wget http://labfile.oss.aliyuncs.com/courses/580/mth.py

二、实验步骤

接下来通过实践操作,带领大家使用 Python3 实现 Markdown to Html 的脚本。

环境准备

实验环境中已经安装了 Python3.5 和包管理工具 pip3 ,此外需要安装的库有 markdown 、beautifulsoup4 和 html5lib ,在终端命令行执行以下命令安装它们:

$ sudo pip3 install markdown
$ sudo pip3 install beautifulsoup4
$ sudo pip3 install html5lib

编写命令行参数解析类

在 /home/shiyanlou/Code 目录下新建文件 mth.py ,首先引入所需模块和方法:

import os
import sys
import getopt
import markdown
from bs4 import BeautifulSoup

创建 ArgsParse 类用于解析命令行选项和参数:

class ArgsParse:
    '''命令行参数解析类
    '''

    # 参数说明文档
    options_explain = '''Options:
        -h, --help  参数说明
        -f          被处理的 Markdown 文件
        -S          美化页面的 CSS 文件
        -d          转换成 HTML 文件后,新文件所在目录路径
        -F          转换成 HTML 文件后,新文件的文件名'''

其中 options_explain 是在命令行执行 python3 mth.py -h 命令时打印到屏幕上的参数说明。

最后定义初始化方法和处理选项的方法,代码及其说明如下:

def __init__(self):
        # 选项有“短选项”和“长选项”两种
        # 短选项格式:一个减号一个字母;长选项格式:俩减号多个字母
        # getopt.getopt 方法有仨参数:要处理的对象列表、短选项组、长选项组
        # 短选项组为字符串,若选项有参数,后面加冒号
        # 长选项组为列表,若选项有参数,后面加等号
        # 该方法返回值为二元元组,元组中每个元素都是列表
        # 一个是选项解析结果,另一个是其余参数
        options, _ = getopt.getopt(sys.argv[1:], 'hf:d:S:F:', ['help'])
        # options 是列表,列表中每个元素都是二元元组,将其转换为字典
        self.options_dict = (dict(options))
        # 如果选项中有 -h 或 --help ,打印参数说明文档并结束程序
        if '-h' in self.options_dict or '--help' in self.options_dict:
            print(self.options_explain)
            sys.exit()
        # 调用参数处理函数,将各个参数赋值给相应的属性
        self.args_parse()

    def args_parse(self):
        '''参数处理函数,从解析后的选项字典中读取各个文件名
        '''
        self.markdown_file = self.options_dict.get('-f')
        self.css_file = self.options_dict.get('-S')
        self.html_file_dir = self.options_dict.get('-d')
        self.html_file = self.options_dict.get('-F')

编写转换文本类

在 mth.py 文件中定义 Markdown2Html 类,用以将 Markdown 文本转换为 HTML 文本并保存。

因为 markdown 模块生成的 HTML 代码是不包括 head 标签的,这样会可能造成浏览器中渲染 HTML 时显示乱码,而且我们有时可能也需要添加 CSS 来美化网页,所以需要一个数据属性存放生成 HTML 代码时用到的 head 标签以及准备存放可能用到的 style 标签。

这部分处理工作在初始化时完成:

class Markdown2Html:
    '''将 Markdown 文档转换为 HTML 文档并存储
    '''

    # HTML 文档的默认 head 标签
    head_tag = '<head><meta charset="utf-8" /></head>'

    def __init__(self, css_file=None):
        ''' 初始化方法,处理未来向 HTML 文档中添加的 head 标签
        '''
        if css_file:
            with open(css_file) as f:
                data = f.read()
            self.head_tag = (self.head_tag[:-7] +
                    '<style type="text/css">{}</style>'.format(data) +
                    self.head_tag[-7:])

然后是脚本的核心方法,用于将 Markdown 文本转换为 HTML 文本:

    def switch(self):
        '''核心方法,将 Markdown 文本转换为 HTML 文本并保存
        '''
        # 读取 Markdown 文件内容
        with open(args.markdown_file) as f:
            markdown_text = f.read()
        # 将 Markdown 文件内容转换为 HTML 文本
        # 参数 output_format 指定转换格式
        value = markdown.markdown(markdown_text, output_format='html5')
        # 为 HTML 文本添加 head 标签
        html_raw = self.head_tag + value
        # 使用 bs4 模块美化文本
        html_beautiful = BeautifulSoup(html_raw, 'html5lib').prettify()
        # 处理存储 HTML 文件的目录
        if args.html_file_dir[-1] != '/':
            args.html_file_dir += '/'
        # 处理 HTML 文件名
        if not args.html_file:
            args.html_file = os.path.splitext(
                    os.path.basename(args.markdown_file))[0] + '.html'
        # 存储 HTML 文本的路径
        html_file_route = args.html_file_dir + args.html_file
        # 将 HTML 文本存入文件
        with open(html_file_route, 'w') as f:
            f.write(html_beautiful)

关于 os.path 模块的用法说明:

  • os.path.abspath() 将参数路径转为绝对路径并返回

  • os.path.dirname() 获得参数路径的目录部分并返回(例如 "\home\a.txt" 为参数,返回 "\home" )

  • os.path.basename() 返回参数路径字符串中的完整文件名(文件名 + 后缀名)

  • os.path.splitext() 将参数转换为包含文件名和后缀名两个元素的元组并返回

关于 os 模块更多详情,参见官方文档。

在使用 with open 语句读写文件时,无需提供 encoding='utf8' 参数,因为 Python3 默认的读写编码格式就是 UTF-8 。

以上为转换文本的全部代码。定义好解析参数类和转换文本类之后,依次创建它们的实例,然后调用 switch 方法即可实现功能:

if __name__ == '__main__':
    args = ArgsParse()
    markdown2html = Markdown2Html(args.css_file)
    markdown2html.switch()

测试脚本

在 /home/shiyanlou/Code 目录下使用 wget 命令把测试用的 markdown 文件下载下来:

$ wget http://labfile.oss.aliyuncs.com/courses/580/test.md

以及测试用的 CSS 文件:

$ wget http://labfile.oss.aliyuncs.com/courses/580/GithubMarkdownCSS.css

一切就绪,开始执行脚本。

首先测试帮助功能:

shiyanlou:Code/ $ python3 mth.py -h
Options:
        -h, --help  参数说明
        -f          被处理的 Markdown 文件
        -S          美化页面的 CSS 文件
        -d          转换成 HTML 文件后,新文件所在目录路径
        -F          转换成 HTML 文件后,新文件的文件名
shiyanlou:Code/ $ python3 mth.py --help
Options:
        -h, --help  参数说明
        -f          被处理的 Markdown 文件
        -S          美化页面的 CSS 文件
        -d          转换成 HTML 文件后,新文件所在目录路径
        -F          转换成 HTML 文件后,新文件的文件名
shiyanlou:Code/ $

然后执行转换脚本的命令:

shiyanlou:Code/ $ ls
GithubMarkdownCSS.css  mth.py  test.md
shiyanlou:Code/ $ python3 mth.py -f test.md -S GithubMarkdownCSS.css -d . -F test.html
shiyanlou:Code/ $ ls
GithubMarkdownCSS.css  mth.py  test.html  test.md
shiyanlou:Code/ $ head test.html
<html>
 <head>
  <meta charset="utf-8"/>
  <style type="text/css">
   body {
  font-family: Helvetica, arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  padding-top: 10px;
  padding-bottom: 10px;
shiyanlou:Code/ $

大家可以打开文件管理器,找到文件后使用浏览器打开:

三、完整代码

可以在实验环境中用如下命令下载:

$ wget http://labfile.oss.aliyuncs.com/courses/580/mth.py

完整代码:

完整代码及后续教程,欢迎打开实验楼进行学习,课程地址:

https://www.shiyanlou.com/courses/580

????????????点击阅读原文,查看完整教程

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值