【复盘】文档批量切割与转换:python + pandoc + shell

背景

现有一 Markdown 文件,其中有 50 个小组块,组块之间以二级标题区分。每个二级标题下有 1 张图片,然后是文字。

以下是文档中部分内容示例:

## 1. 小明

![](小明打羽毛球的球场网址)

今天小明去打羽毛球。

## 2. 小红

![](小红逛街的商店网址)

今天小红去逛街。

现在希望:

  • 把这 50 个组块单独切割出来
  • 每个组块均转换为 doc 文件
  • 文件名为小标题名(只有中文,不含数字序号)
  • 每个小组块文件中,以小标题为内文标题(只有中文,不含数字序号)

问:

如何批量完成该工作?

任务拆分

  1. 将 1 个 md 文件批量切割 md 文件 为 50 个 md 文件
  2. 切割的同时,将小标题作为文件名取出并直接为每个组块文件命名
  3. 将 50 个 md 文件批量转换成 50 个 doc 文件

工具准备

  • python:撰写批量切割的 python 脚本
  • pandoc:用于格式转换
  • bash:通过 shell 脚本实现批量的格式转换;有可能需要用上批量重命名的命令 rename 来进行边角修改

任务 1: 批量切割文档

首先思考:

如果是手动切割,过程是怎样的?

显然我们是以二级标题为切割标志的。而二级标题的代码是 ##,会不会在文中其他地方出现呢?

进一步观察与思考会发现:切割标志其实不是 ##,而是 \n## ——也就是说,段落中或者网址中出现的 ## 都不是二级标题的代码,只有换行符 \n## 连续出现时,## 才是二级标题代码。因此我们确定了切割标志为:(字符串)\n##

python 中字符串的 str.split(sep, maxsplit) 方法可接受 2 个参数[1]

  1. 第 1 个参数 sep 表示分割标志(这里是 \n##
  2. 第 2 个参数 maxsplit 表示最多分割几次(由于是 50 份,故应该切割 49 次)

所以将读入的全文以小标题为界分割为 50 份字符串的关键代码是:

# 已将全文读入 finContent 中
sp50 = finContent.split("\n##", 49)

任务 2:批量将已切割好的字符串导出到 50 个 md 文件中,并以各小标题为各文件命名

批量导出到 50 个 md 文件中并不难,如果没有上述命名需求,那么直接一个迭代 50 次的 for 循环即可解决该问题。

问题在于:

如何取得各小标题名并为新生成的文件命名?

观察每个小组块,发现规律:

  1. 每个二级标题中都有英文句号「.」,在「.」后的部分,除去空格,即为小标题所有文字,这意味着:只要取得小标题所在行的内容,就可以用 str.split() 方法取得小标题对应文字
  2. 二级标题下即为图片代码,也就是说对这 50 个字符串而言,每个字符串可以 \n\n![]( 为分割标志,从而取得小标题所在行的内容

因此取得小标题的关键代码为:

index = ((((iStr.split("\n\n![](")[0]).split('.'))[1]).split(' '))[1]

综合前 2 项任务,该脚本代码如下(同时放在 GitHub 库中):

#coding: utf-8

originPath = "/home/sushangjun/Documents/"
srcPath = originPath + "Top50Bussiness.txt"
tarPath = originPath + "output50/"

fin = open(srcPath, 'r')

finContent = fin.read()

sp50 = finContent.split("\n##", 49)

for iStr in sp50:
    index = ((((iStr.split("\n\n![](")[0]).split('.'))[1]).split(' '))[1]
    fout = open(tarPath + "{}.md".format(index), 'w')
    fout.write("## " + index + "\n\n![](" + (iStr.split("\n\n![]("))[1])
    fout.close()

fin.close()

在命令行中执行该脚本,即可完成批量切割任务。

任务 3: 批量转换格式

这里需要使用 Pandoc[2],Debian 系 Linux 只要使用 apt-get 安装即可:

$ sudo apt-get install pandoc

完成后,输入 pandoc --version 查看是否安装成功。

若安装成功,只要下述命令,即可将 a.md 转换为 a.doc

$ pandoc a.md -o a.doc -c Github.css

但是这只能实现单文件的格式转换,若需要多文件的格式转换,显然需要批处理。对 *nix 稍有了解的人很容易联想到使用 bash shell 来解决这个问题:

  1. 读取目录下的文件列表
  2. 对读取的每个文件名执行上述 pandoc 命令

由于事情紧急,因此查找网络资料后,在命令行中输入下述命令,完成文件格式批量转换:[3]

注:下述操作均默认在 50 个 md 文件所在目录下进行

$ ls > aa.md
$ cat aa.md |while read line
> do
> pandoc $line -o $line.doc -c Github.css
> done

这样基本完成了批量格式转换问题。但有 1 点不美:那就是在此操作下,得到的文件后缀是 .md.doc 而非 .doc。如何解决这个问题呢?最后我们就使用 rename 方法搭配简单的正则表达式,完成该任务:[4]

rename 's/\.md.doc/\.doc/' *

相关代码也已经写成 shell script 形式上传到 GitHub 库中.

参考资料


  1. Python 3.5: str.split

  2. Markdown写作进阶:Pandoc入门浅谈

  3. shell 循环文件列表取出文件名

  4. Linux批量修改文件名方法小结

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容