脚本写的好,下班下得早!程序员一大特长就是用程序实现自动化脚本,让枯燥、重复的工作自动执行~
能否写出高效实用的脚本代码,直接影响着一个程序员的幸福生活 [下班时间]。今天我们就手把手教你用 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
????????????点击阅读原文,查看完整教程