利用Python實(shí)現(xiàn)Markdown文檔格式轉(zhuǎn)換詳解
Markdown是一種輕量級(jí)的標(biāo)記語(yǔ)言,用于以簡(jiǎn)潔易讀的方式編寫(xiě)文本內(nèi)容,同時(shí)能夠方便地轉(zhuǎn)換為結(jié)構(gòu)化的HTML文本或其他格式,常用于編寫(xiě)文檔、博客、論壇帖子等。它與純文本極為接近,幾乎不帶任何標(biāo)記或格式,卻仍能有效呈現(xiàn)文檔的重要結(jié)構(gòu)。Markdown的詳細(xì)使用說(shuō)明可參考:Markdown教程。
主流的大型語(yǔ)言模型(LLM),如OpenAI的GPT-4,天生便“精通”Markdown,并且常常在未被提示的情況下將其融入回應(yīng)之中。此外,Markdown的規(guī)范還具有極高的編碼效率,可謂一舉多得。
因此,學(xué)習(xí)Markdown語(yǔ)言的使用,并通過(guò)Python實(shí)現(xiàn)Markdown文本與其他格式文本的相互轉(zhuǎn)換,能夠提高文檔編寫(xiě)的效率和質(zhì)量,滿足不同場(chǎng)景下的文檔處理需求。
1 MarkItDown庫(kù)
1.1 MarkItDown庫(kù)介紹
MarkItDown庫(kù)是一款輕量級(jí)的Python版Markdown格式解析與渲染工具,能夠?qū)⒍喾N文件格式高效轉(zhuǎn)換為Markdown格式,從而滿足大語(yǔ)言模型(LLMs)及相關(guān)文本分析流程的需求。它專注于以Markdown格式精準(zhǔn)保留文檔的關(guān)鍵結(jié)構(gòu)與內(nèi)容,包括標(biāo)題、列表、表格、鏈接等元素。雖然其輸出結(jié)果既美觀又易于人類用戶閱讀,但其核心設(shè)計(jì)宗旨是為文本分析工具提供支持,因此對(duì)于那些需要高保真度轉(zhuǎn)換以供人類閱讀的文檔,它可能并非最優(yōu)選擇。
目前,MarkItDown庫(kù)支持以下文件類型的轉(zhuǎn)換:
- PowerPoint(按從上到下、從左到右的順序讀取內(nèi)容)
- Word
- Excel
- 圖片(支持EXIF元數(shù)據(jù)提取和光學(xué)字符識(shí)別OCR)
- 音頻(支持EXIF元數(shù)據(jù)提取和語(yǔ)音轉(zhuǎn)錄)
- HTML
- 基于文本的格式(如CSV、JSON、XML)
- ZIP文件(可遍歷文件內(nèi)的內(nèi)容進(jìn)行轉(zhuǎn)換)
- YouTube網(wǎng)址
- 以及其他更多類型!
MarkItDown庫(kù)的官方倉(cāng)庫(kù)見(jiàn):markitdown,MarkItDown需要在Python3.10及以上版本運(yùn)行,MarkItDown庫(kù)安裝代碼如下:
pip install 'markitdown[all]~=0.1.0a1'
或者從源代碼安裝:
git clone git@github.com:microsoft/markitdown.git cd markitdown pip install -e packages/markitdown[all]
1.2 MarkItDown庫(kù)使用示例
MarkItDown庫(kù)將不同文件轉(zhuǎn)換為Markdown格式的方式非常簡(jiǎn)單。只需初始化工具類,然后調(diào)用類對(duì)象的convert方法對(duì)文件進(jìn)行轉(zhuǎn)換,并輸出Markdown格式字符串即可。
示例 1
以下代碼展示了如何生成示例Excel數(shù)據(jù),并使用MarkItDown庫(kù)將其轉(zhuǎn)換為Markdown格式的字符串和文件:
import pandas as pd import numpy as np # 生成一些示例數(shù)據(jù) np.random.seed(0) data = { 'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'], 'Age': [25, 30, 35, 40, 45, 50], 'Gender': ['Female', 'Male', 'Male', 'Male', 'Female', 'Male'], 'Score1': np.random.randint(0, 100, 6), 'Score2': np.random.randint(0, 100, 6) } # 創(chuàng)建一個(gè)基本的DataFrame df = pd.DataFrame(data) # 添加多級(jí)索引 index = pd.MultiIndex.from_product([['Group A', 'Group B'], ['Subgroup 1', 'Subgroup 2', 'Subgroup 3']], names=['Group', 'Subgroup']) df.index = index # 計(jì)算每行的總分和平均分 df['Total Score'] = df[['Score1', 'Score2']].sum(axis=1) df['Average Score'] = df[['Score1', 'Score2']].mean(axis=1) # 顯示表格 # print(df) # 保存表格為xlsx文件 df.to_excel('test.xlsx') # 將excel轉(zhuǎn)換為markdown文件 from markitdown import MarkItDown # 通過(guò)傳遞enable_plugins=Fals參數(shù),表明在進(jìn)行轉(zhuǎn)換時(shí)不啟用插件功能 md = MarkItDown(enable_plugins=False) # 調(diào)用md對(duì)象的convert方法,將test.xlsx文件進(jìn)行轉(zhuǎn)換 result = md.convert("test.xlsx") # text_content為一個(gè)字符串 print(result.text_content) # 返回結(jié)果為字典 print(result.__dict__) # 將結(jié)果保存為Markdown文件 # 定義要保存的Markdown文件的文件名 output_file = "output.md" # 以寫(xiě)入模式打開(kāi)文件,如果文件不存在則創(chuàng)建 with open(output_file, 'w', encoding='utf-8') as file: # 將轉(zhuǎn)換后的文本內(nèi)容寫(xiě)入文件 file.write(result.text_content)
示例 2
本示例展示了使用MarkItDown庫(kù)將pdf文件轉(zhuǎn)換為Markdown數(shù)據(jù),并開(kāi)啟Azure Document Intelligence功能,也就是利用Microsoft文檔智能輔助進(jìn)行轉(zhuǎn)換。注意,此過(guò)程不會(huì)轉(zhuǎn)換PDF中的圖片。
import random import string # pip install fpdf from fpdf import FPDF from PIL import Image, ImageDraw, ImageFont # 生成隨機(jī)文字 def generate_random_text(length): letters = string.ascii_letters + string.digits + string.punctuation return ''.join(random.choice(letters) for i in range(length)) # 生成隨機(jī)圖片 def generate_random_image(width, height): # 創(chuàng)建一個(gè)隨機(jī)顏色的圖片 image = Image.new('RGB', (width, height), color=( random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) )) draw = ImageDraw.Draw(image) font = ImageFont.load_default() # 在圖片上添加隨機(jī)文字 text = generate_random_text(20) draw.text((10, 10), text, fill=(255, 255, 255), font=font) image_path = 'random_image.png' image.save(image_path) return image_path # 創(chuàng)建PDF并添加隨機(jī)圖片和文字 def create_pdf(): pdf = FPDF() pdf.add_page() # 添加隨機(jī)文字到PDF頂部 top_text = generate_random_text(100) pdf.set_font("Arial", size=12) pdf.multi_cell(0, 10, txt=top_text) # 生成隨機(jī)圖片 image_path = generate_random_image(300, 200) # 添加圖片到PDF pdf.image(image_path, x=10, y=pdf.get_y(), w=100) # 移動(dòng)到圖片下方 pdf.ln(210) # 添加隨機(jī)文字到PDF底部 bottom_text = generate_random_text(100) pdf.multi_cell(0, 10, txt=bottom_text) # 保存PDF pdf.output("test.pdf") # 創(chuàng)建PDF create_pdf() from markitdown import MarkItDown # 將文檔轉(zhuǎn)換為markdown # Azure文檔智能:可以使用Microsoft文檔智能進(jìn)行轉(zhuǎn)換 md = MarkItDown(docintel_endpoint="<document_intelligence_endpoint>") # 不會(huì)轉(zhuǎn)換PDF中的圖片 result = md.convert("test.pdf") print(result.text_content)
示例 3
本示例展示了借助MarkItDown庫(kù)使用大語(yǔ)言模型生成圖像描述。在初始化該工具類時(shí),需提供大語(yǔ)言模型客戶端(llm_client)和大語(yǔ)言模型名字(llm_model)。
from markitdown import MarkItDown from openai import OpenAI client = OpenAI() md = MarkItDown(llm_client=client, llm_model="gpt-4o") result = md.convert("example.jpg") print(result.text_content)
2 Python-Markdown庫(kù)
2.1 Python-Markdown庫(kù)介紹
若需將Markdown格式轉(zhuǎn)換為HTML或其他格式,可以使用Python中的Python-Markdown庫(kù)。該庫(kù)是Markdown格式轉(zhuǎn)換為HTML的純Python實(shí)現(xiàn),它支持標(biāo)準(zhǔn)的Markdown語(yǔ)法,并提供了許多擴(kuò)展以增強(qiáng)功能。
Python-Markdown庫(kù)的官方倉(cāng)庫(kù)見(jiàn):Python-Markdown,Python-Markdown庫(kù)需要在Python3.7及以上版本運(yùn)行,Python-Markdown庫(kù)安裝代碼如下:
pip install markdown
2.2 Python-Markdown庫(kù)使用示例
示例 1
本示例展示了如何基于Python-Markdown庫(kù)將Markdown文本轉(zhuǎn)換為HTML。需注意,Python-Markdown庫(kù)采用的是原始Markdown語(yǔ)法,即當(dāng)列表項(xiàng)由多個(gè)段落構(gòu)成時(shí),列表項(xiàng)中每個(gè)后續(xù)段落都必須以4個(gè)空格的縮進(jìn)起始。
import markdown print(f'Markdown Version: {markdown.__version__}') # 定義Markdown文本 markdown_text = """ # 這是一個(gè)markdown標(biāo)題 這是一段普通文字,后續(xù)為列表項(xiàng)需要換行或者4個(gè)空格。 - 列表項(xiàng) 1 - 列表項(xiàng) 2 [markdown超鏈接](https://www.example.com) """ # 將Markdown文本轉(zhuǎn)換為 HTML html_text = markdown.markdown(markdown_text) # 打印轉(zhuǎn)換后的HTML文本 print(html_text)
示例 2
本示例展示了基于Python-Markdown庫(kù)從本地Markdown文件中讀取內(nèi)容,并將其轉(zhuǎn)換為HTM格式:
import markdown def create_example_markdown(file_path): example_content = """ # markdown示例標(biāo)題 這是一個(gè)示例的Markdown文件內(nèi)容。 ## 子標(biāo)題 下面是一個(gè)無(wú)序列表: - 列表項(xiàng) 1 - 列表項(xiàng) 2 這里還有一個(gè)有序列表: 1. 有序項(xiàng) 1 2. 有序項(xiàng) 2 """ try: with open(file_path, 'w', encoding='utf-8') as file: file.write(example_content) print("示例 Markdown 文件已創(chuàng)建。") except Exception as e: print(f"錯(cuò)誤: 創(chuàng)建文件時(shí)發(fā)生未知錯(cuò)誤: {e}") def read_markdown_file(file_path): try: with open(file_path, 'r', encoding='utf-8') as file: return file.read() except FileNotFoundError: print(f"錯(cuò)誤: 文件 {file_path} 未找到。") return None except Exception as e: print(f"錯(cuò)誤: 讀取文件時(shí)發(fā)生未知錯(cuò)誤: {e}") return None # 創(chuàng)建本地示例markdown文件 file_path = 'example.md' create_example_markdown(file_path) markdown_text = read_markdown_file(file_path) if markdown_text is not None: html_text = markdown.markdown(markdown_text) print(html_text)
示例 3
本示例展示了在使用Python-Markdown庫(kù)將Markdown文本轉(zhuǎn)換為HTML的過(guò)程中,如何運(yùn)用自定義擴(kuò)展函數(shù)來(lái)修改生成的HTML格式。例如為標(biāo)題和列表項(xiàng)添加樣式。
from markdown.treeprocessors import Treeprocessor from markdown.extensions import Extension class MarkdownStyleProcessor(Treeprocessor): # 遍歷html節(jié)點(diǎn)設(shè)置不同參數(shù) def run(self, tree_root): for element in tree_root.iter(): if element.tag == "h1": element.set("class", "custom-h1") element.set("style", "color: #007BFF; font-size: 2.5em; margin-bottom: 0.5em;") elif element.tag == "h2": element.set("class", "custom-h2") element.set("style", "color: #00FF00; font-size: 1.1em; margin-bottom: 0.3em;") class MarkdownStyleExtension(Extension): # 該方法用于擴(kuò)展Markdown對(duì)象 def extendMarkdown(self, markdown_obj): # markdown_style定義處理的名字。10表示表示處理器的優(yōu)先級(jí),值越大越往后處理 markdown_obj.treeprocessors.register(MarkdownStyleProcessor(markdown_obj), "markdown_style", 10) import markdown try: with open("example.md", "r", encoding="utf-8") as file: markdown_content = file.read() # 將Markdown內(nèi)容轉(zhuǎn)換為HTML,同時(shí)使用自定義的擴(kuò)展 html_result = markdown.markdown( markdown_content, extensions=[MarkdownStyleExtension()] ) print(html_result) except Exception as e: print(f"發(fā)生錯(cuò)誤: {e}")
示例 4
Python-Markdown庫(kù)集成了若干插件,用以支持不同類型Markdown語(yǔ)法的轉(zhuǎn)換。這些插件的調(diào)用可通過(guò)轉(zhuǎn)換函數(shù)的extensions參數(shù)進(jìn)行設(shè)置。以下是可擴(kuò)展的功能及調(diào)用參數(shù):
擴(kuò)展功能 | 調(diào)用參數(shù) | 模塊路徑 |
---|---|---|
額外功能 | extra | markdown.extensions.extra |
縮寫(xiě) | abbr | markdown.extensions.abbr |
屬性列表 | attr_list | markdown.extensions.attr_list |
定義列表 | def_list | markdown.extensions.def_list |
圍欄代碼塊 | fenced_code | markdown.extensions.fenced_code |
腳注 | footnotes | markdown.extensions.footnotes |
HTML中的Markdown | md_in_html | markdown.extensions.md_in_html |
表格 | tables | markdown.extensions.tables |
警告 | admonition | markdown.extensions.admonition |
代碼高亮 | codehilite | markdown.extensions.codehilite |
遺留屬性 | legacy_attrs | markdown.extensions.legacy_attrs |
遺留強(qiáng)調(diào) | legacy_em | markdown.extensions.legacy_em |
元數(shù)據(jù) | meta | markdown.extensions.meta |
新行轉(zhuǎn)斷行 | nl2br | markdown.extensions.nl2br |
合理列表 | sane_lists | markdown.extensions.sane_lists |
智能標(biāo)點(diǎn) | smarty | markdown.extensions.smarty |
目錄 | toc | markdown.extensions.toc |
Wiki鏈接 | wikilinks | markdown.extensions.wikilinks |
以下代碼展示了如何基于Python-Markdown庫(kù)從文件中讀取Markdown內(nèi)容,并利用該庫(kù)的擴(kuò)展功能來(lái)增添額外特性,例如腳注、代碼塊和表格。
示例markdown文件如下:
# 示例 示例代碼如下[^1]: print("Hello World!") 示例表格如下[^2]: |姓名|年齡| |:-|-:| |張三|16| |李四|23| [^1]: 示例代碼 [^2]: 示例表格
轉(zhuǎn)換代碼如下:
import markdown with open("example.md", "r", encoding="utf-8") as fd: markdown_text = fd.read() # 通過(guò)extensions參數(shù)設(shè)置轉(zhuǎn)換格式 html_output = markdown.markdown( markdown_text, extensions=["tables", "footnotes", "fenced_code"] ) print(html_output)
以上就是利用Python實(shí)現(xiàn)Markdown文檔格式轉(zhuǎn)換詳解的詳細(xì)內(nèi)容,更多關(guān)于Python Markdown格式轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python逐像素獲取柵格經(jīng)緯度分別保存在兩個(gè)矩陣中(代碼收藏)
這篇文章主要介紹了python逐像素獲取柵格經(jīng)緯度分別保存在兩個(gè)矩陣中的實(shí)現(xiàn)示例,建議收藏代碼總會(huì)用到,有需要的朋友可以借鑒參考下,希望能夠有所幫助2024-01-01python+opencv實(shí)現(xiàn)閾值分割
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)閾值分割的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12python使用pandas處理大數(shù)據(jù)節(jié)省內(nèi)存技巧(推薦)
這篇文章主要介紹了python使用pandas處理大數(shù)據(jù)節(jié)省內(nèi)存技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python實(shí)現(xiàn)繪制多種激活函數(shù)曲線詳解
所謂激活函數(shù)(Activation?Function),就是在人工神經(jīng)網(wǎng)絡(luò)的神經(jīng)元上運(yùn)行的函數(shù),負(fù)責(zé)將神經(jīng)元的輸入映射到輸出端。這篇文章主要介紹了Python如何實(shí)現(xiàn)繪制多種激活函數(shù)曲線,希望對(duì)大家有所幫助2023-04-04python實(shí)現(xiàn)數(shù)學(xué)模型(插值、擬合和微分方程)
這篇文章主要介紹了python實(shí)現(xiàn)數(shù)學(xué)模型(插值、擬合和微分方程),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11python使用knn實(shí)現(xiàn)特征向量分類
這篇文章主要為大家詳細(xì)介紹了python使用knn實(shí)現(xiàn)特征向量分類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12