2014-06-13 47 views
3

我有幾個.docx文件,其中包含大量相似的文本塊:包含300多個新聞稿的docx文件,每個新聞稿1-2頁,需要分成單獨的文本文件。說明文章之間差異的唯一一致方式是在兩篇文章之間始終存在分頁符。如何使用docx中的python-docx標識分頁符

不過,我不知道如何轉換包含Word文檔文本時發現分頁符和分頁信息在轉換後會丟失使用我當前的腳本

我想知道如何保存將.docx文件轉換爲.txt時出現HARD分頁符。對我來說沒關係他們在文本文件中的樣子,只要它們在稍後掃描文本文件時具有唯一標識

以下是我用來將docx文件轉換爲txt的腳本:

def docx2txt(file_path): 
    document = opendocx(file_path) 
    text_file = open("%s.txt" % file_path[:len(file_path)-5], "w") 
    paratextlist = getdocumenttext(document) 
    newparatextlist = [] 
    for paratext in paratextlist: 
     newparatextlist.append(paratext.encode("utf-8")) 
    text_file.write('\n\n'.join(newparatextlist)) 
    text_file.close() 
+0

開箱即用python-docx可能沒有辦法,但將示例docx文件另存爲.zip文件(以顯示由該文檔構成的原始.xml文件),然後戳開直到你看到看起來像分頁符的東西。然後,您可以將函數添加到您的python-docx安裝中,以便在讀取文件時處理這些函數。 python-docx源文件有詳細記錄,並且在 – wnnmaw

+0

之間稍微戳一下就不太複雜了。即使想要使事情變得更復雜,您也可以將docx保存爲HTML,然後將所有內容分解到分頁符上。 – Bioto

回答

3

硬分頁符將顯示爲一個運行元素(<w:r>)內的<w:br>元素,像這樣:

<w:p> 
    <w:r> 
    <w:t>some text</w:t> 
    <w:br w:type="page"/> 
    </w:r> 
</w:p> 

所以一個辦法是用鮮明的串替換所有這些事件文字,李可能是「{{foobar}}」。

的一個實現將是這樣的:

from lxml import etree 
from docx import nsprefixes 

page_br_elements = document.xpath(
    "//w:p/w:r/w:br[@w:type='page']", namespaces={'w': nsprefixes['w']} 
) 
for br in page_br_elements: 
    t = etree.Element('w:t', nsmap={'w': nsprefixes['w']}) 
    t.text = '{{foobar}}' 
    br.addprevious(t) 
    parent = br.getparent() 
    parent.remove(br) 

我沒有時間來測試這一點,所以你可能會遇到一些丟失的進口或什麼的,但你需要的一切應該已經在docx模塊。其餘的是_Element上的方法調用lxml

讓我知道你如何去,如果需要我可以調整。

+0

親愛的@scanny,這段代碼似乎是使用python-docx的舊版本。有沒有辦法做到這一點與新的python-docx庫?考慮到兩個版本似乎不能共存,我必須卸載舊版本。 – XAnguera

+0

最好問一個作爲一個新問題。如果你用'python-docx'標記它,我會看到它。 – scanny

+0

謝謝@scanny,我設法用一個簡單的技巧來使用這段代碼。我只是在裏面創建了一個帶有舊的python docx庫的虛擬環境,並且每當我需要這個腳本時就調用它的python。 – XAnguera

相關問題