【復盤】文檔批量切割與轉換:python + pandoc + shell

背景

現(xiàn)有一 Markdown 文件心铃,其中有 50 個小組塊钟病,組塊之間以二級標題區(qū)分。每個二級標題下有 1 張圖片漾狼,然后是文字。

以下是文檔中部分內容示例:

## 1. 小明

![](小明打羽毛球的球場網(wǎng)址)

今天小明去打羽毛球饥臂。

## 2. 小紅

![](小紅逛街的商店網(wǎng)址)

今天小紅去逛街逊躁。

現(xiàn)在希望:

  • 把這 50 個組塊單獨切割出來
  • 每個組塊均轉換為 doc 文件
  • 文件名為小標題名(只有中文,不含數(shù)字序號)
  • 每個小組塊文件中隅熙,以小標題為內文標題(只有中文稽煤,不含數(shù)字序號)

問:

如何批量完成該工作?

任務拆分

  1. 將 1 個 md 文件批量切割 md 文件 為 50 個 md 文件
  2. 切割的同時囚戚,將小標題作為文件名取出并直接為每個組塊文件命名
  3. 將 50 個 md 文件批量轉換成 50 個 doc 文件

工具準備

  • python:撰寫批量切割的 python 腳本
  • pandoc:用于格式轉換
  • bash:通過 shell 腳本實現(xiàn)批量的格式轉換酵熙;有可能需要用上批量重命名的命令 rename 來進行邊角修改

任務 1: 批量切割文檔

首先思考:

如果是手動切割,過程是怎樣的驰坊?

顯然我們是以二級標題為切割標志的匾二。而二級標題的代碼是 ##,會不會在文中其他地方出現(xiàn)呢拳芙?

進一步觀察與思考會發(fā)現(xiàn):切割標志其實不是 ##察藐,而是 \n## ——也就是說,段落中或者網(wǎng)址中出現(xiàn)的 ## 都不是二級標題的代碼态鳖,只有換行符 \n## 連續(xù)出現(xiàn)時转培,## 才是二級標題代碼。因此我們確定了切割標志為:(字符串)\n##

python 中字符串的 str.split(sep, maxsplit) 方法可接受 2 個參數(shù)[1]

  1. 第 1 個參數(shù) sep 表示分割標志(這里是 \n##
  2. 第 2 個參數(shù) maxsplit 表示最多分割幾次(由于是 50 份浆竭,故應該切割 49 次)

所以將讀入的全文以小標題為界分割為 50 份字符串的關鍵代碼是:

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

任務 2:批量將已切割好的字符串導出到 50 個 md 文件中浸须,并以各小標題為各文件命名

批量導出到 50 個 md 文件中并不難惨寿,如果沒有上述命名需求,那么直接一個迭代 50 次的 for 循環(huán)即可解決該問題删窒。

問題在于:

如何取得各小標題名并為新生成的文件命名裂垦?

觀察每個小組塊,發(fā)現(xiàn)規(guī)律:

  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()

在命令行中執(zhí)行該腳本梢灭,即可完成批量切割任務夷家。

任務 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

但是這只能實現(xiàn)單文件的格式轉換义屏,若需要多文件的格式轉換,顯然需要批處理耳鸯。對 *nix 稍有了解的人很容易聯(lián)想到使用 bash shell 來解決這個問題:

  1. 讀取目錄下的文件列表
  2. 對讀取的每個文件名執(zhí)行上述 pandoc 命令

由于事情緊急湿蛔,因此查找網(wǎng)絡資料后,在命令行中輸入下述命令县爬,完成文件格式批量轉換:[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/' *

相關代碼也已經(jīng)寫成 shell script 形式上傳到 GitHub 庫中.

參考資料


  1. Python 3.5: str.split ?

  2. Markdown寫作進階:Pandoc入門淺談 ?

  3. shell 循環(huán)文件列表取出文件名 ?

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末耳高,一起剝皮案震驚了整個濱河市扎瓶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泌枪,老刑警劉巖概荷,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碌燕,居然都是意外死亡误证,警方通過查閱死者的電腦和手機继薛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愈捅,“玉大人遏考,你說我怎么就攤上這事±督鳎” “怎么了灌具?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長譬巫。 經(jīng)常有香客問我咖楣,道長,這世上最難降的妖魔是什么缕题? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任截歉,我火速辦了婚禮胖腾,結果婚禮上烟零,老公的妹妹穿的比我還像新娘。我一直安慰自己咸作,他們只是感情好锨阿,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著记罚,像睡著了一般墅诡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桐智,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天末早,我揣著相機與錄音,去河邊找鬼说庭。 笑死然磷,一個胖子當著我的面吹牛,可吹牛的內容都是我干的刊驴。 我是一名探鬼主播姿搜,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捆憎!你這毒婦竟也來了舅柜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤躲惰,失蹤者是張志新(化名)和其女友劉穎致份,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體础拨,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡氮块,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年瞬沦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雇锡。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡逛钻,死狀恐怖,靈堂內的尸體忽然破棺而出锰提,到底是詐尸還是另有隱情曙痘,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布立肘,位于F島的核電站边坤,受9級特大地震影響,放射性物質發(fā)生泄漏谅年。R本人自食惡果不足惜茧痒,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望融蹂。 院中可真熱鬧旺订,春花似錦、人聲如沸超燃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽意乓。三九已至樱调,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間届良,已是汗流浹背笆凌。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留士葫,地道東北人乞而。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像为障,于是被迫代替她去往敵國和親晦闰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內容